因此,您有一个由 0 和 1 组成的矩阵,并且您想知道在每个滑动块内是否有更多的 0 或更多的 1。让m 和n 表示每个块的行数和列数。
以下使用conv2 执行您想要的操作。它本质上是用内核ones(m,n) 计算二维卷积,它给出了每个块内所有值的总和。将该总和与阈值m*n/2 进行比较,以了解该块中是否有更多的零或一。
由于卷积核ones(m,n)是可分离的,二维卷积可以用列向量ones(m,1)的卷积替换,然后是行向量ones(1,n)的卷积。这导致faster code。
A = randi(2,7,7)-1; %// example matrix with zeros and ones
m = 3; %// number of rows in a block
n = 2; %// number of cols in a block
B = conv2(ones(m,1),ones(1,n),A,'same')>m*n/2; %// result
如果出现平局,这会产生0 结果。要改为生成1,请将> 更改为>=。
此外,您可能希望将 'same' 更改为 'valid' 以仅考虑完整块。
与colfilt 相比,这提供了显着的速度提升:
>> A = randi(2,4672,3001)-1;
>> m = 3; n = 3;
>> tic, B1 = colfilt(A,[m n],'sliding',@mode); toc
Elapsed time is 13.874891 seconds.
>> tic, B2 = conv2(ones(m,1),ones(1,n),A,'same')>m*n/2; toc
Elapsed time is 0.206820 seconds.
>> all(all(B1==B2))
ans =
1