检查1x的nxm块是否在二进制矩阵内(Matlab)

时间:2018-10-05 14:23:58

标签: matlab search matrix find pattern-matching

我有一个90x89二进制矩阵(我无法附加.mat文件,因此无法提供该矩阵)。简而言之,1为好,0为坏。我想要一种快速的方法来检查并返回大型矩阵中所有1的所有nxm块。例如,我想找出二进制矩阵中所有1的3x6(n = 3,m = 6)块是否存在。如果有,则返回每个块中每个单元格的行和列。

1 个答案:

答案 0 :(得分:1)

要找到结果,可以将矩阵视为图像。

腐蚀是一种图像处理操作,可返回本地邻域内的最小值:对于每个像素(矩阵元素),您查看邻域中的所有值(在您的情况下,这将是3x6矩形),然后找到最低。这是您写入输出图像中该像素的值。

现在,如果矩阵元素位于全为1的3x6块的中间,则最小值为1。如果其中甚至只有一个0,则最小值将为0。因此,输出图像将具有每个1x的3x6块的中间元素中的1s。

如果您有权访问图像处理工具箱,请使用the imerode function

如果要查找这些块内所有矩阵元素的坐标,则可以使用膨胀来转换侵蚀的输出。这是相反的操作,并将属于这3x6块的所有元素设置为1。

例如:

% Create some test matrix (66% are 1s, so we have some chance of finding a 3x6 block):
a = randi([0,2], 100,100) > 0;

% Look for 3x6 blocks:
b = imerode(a, ones(3,6));
any(b(:))              % returns true, hopefully
nnz(b)                 % returned 2 for me, there's 2 of these blocks

% Find all pixels belong the these two blocks:
c = imdilate(b, ones(3,6));
nnz(c)                 % returned 2*18 for me, as expected
[row,col] = find(c);   % Now [row(i),col(i)] are the indices to one of these pixels