周期二进制矩阵的周长(在matlab中)



我有一个周期性的二进制矩阵,它包括一块1。我需要找到矩阵中0和1之间的边界。这里有一个例子:

A=[0,1,1,1,0,0,0,1,1;
0,0,0,0,1,1,1,1,0;
0,0,0,0,1,1,1,1,0;
0,0,0,0,1,1,1,1,0;
0,1,1,1,1,1,1,0,0;
0,1,1,1,1,1,1,0,0;
0,1,1,1,0,0,0,0,0;
0,1,1,1,0,0,0,0,0;
0,1,1,1,0,0,0,0,0]

如果矩阵不是周期性的,我可以使用

perim=bwperim(A);

找到周边。但这对于周期矩阵来说并不完美。如果有人能帮我解决这个问题,我将不胜感激。

编辑:周期矩阵是其边界元素连接到矩阵另一侧的边界元素的矩阵。

您可以用图像所连接的列/行填充图像的每一侧。例如,左边缘将用最右侧的列填充。然后使用bwperim,并从结果的每一侧修剪一行/列。

A = [0   1   1   1   0   0   0   1   1;
0   0   0   0   1   1   1   1   0;
0   0   0   0   1   1   1   1   0;
0   0   0   0   1   1   1   1   0;
0   1   1   1   1   1   1   0   0;
0   1   1   1   1   1   1   0   0;
0   1   1   1   0   0   0   0   0;
0   1   1   1   0   0   0   0   0;
0   1   1   1   0   0   0   0   0];
padded_A = [0        A(end,:) 0;
A(:,end) A        A(:,1);
0        A(1,:)   0];
padded_perim = bwperim(padded_A);
perim = padded_perim(2:end-1,2:end-1);

结果:

perim =
0  1  1  1  0  0  0  1  1
0  0  0  0  1  1  1  1  0
0  0  0  0  1  0  0  1  0
0  0  0  0  1  0  0  1  0
0  1  1  1  0  0  1  0  0
0  1  0  0  1  1  1  0  0
0  1  0  1  0  0  0  0  0
0  1  0  1  0  0  0  0  0
0  1  0  1  0  0  0  0  0

您可以使用conv2padarray来查找周长:

4-connected:

perim = A & conv2(padarray(A, [1 1], 'circular'), [0 1 0;1 0 1;0 1 0], 'valid') < 4;

8-connected:

perim = A & conv2(padarray(A, [1 1], 'circular'), [1 1 1;1 0 1;1 1 1], 'valid') < 8;

使用周长的定义:

如果像素为非零并且至少连接到一个零值像素,则该像素是周长的一部分。

使用A & ...确保像素为非零。使用具有选项'circular'padarray来复制边界像素。填充阵列与连接掩码进行卷积。使用conv2和选项'valid'来修剪复制的边界像素。如果它小于48,则意味着它连接到至少一个零值像素。

相关内容

  • 没有找到相关文章

最新更新