大型矩阵的模式滤波器
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。让 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
我试图通过在给定的 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。让 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