大型矩阵的模式滤波器

Mode filter for large matrices

我试图通过在给定的 window 大小中找到最常见的值来过滤值为 0 和 1 的 4672 x 3001 矩阵。 IE。在每个像素周围的 window 中找到模式。一个解决方案是使用

colfilt(A,[3 3],'sliding',@mode)

下面的 link 显示的解决方案对于 window 大小 [3 3] 来说要快得多。

Matlab fast neighborhood operation

但是,当我尝试增加 window 大小时(比如 [9 9]),此解决方案变得非常慢。

是否有其他方法可以使用更大的 window 大小进行过滤?

非常感谢!

所以你有一个由 0 和 1 组成的矩阵,你想知道在每个滑动块中,是有更多的 0 还是更多的 1。让 mn 表示每个块的行数和列数。

以下使用 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