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