我有一个周期性的二进制矩阵,它包括一块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
您可以使用conv2
和padarray
来查找周长:
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'
来修剪复制的边界像素。如果它小于4
或8
,则意味着它连接到至少一个零值像素。