【问题标题】:Mode filter for large matrices大型矩阵的模式滤波器
【发布时间】:2015-04-17 09:06:45
【问题描述】:

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

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

下面的链接显示了一个解决方案,该解决方案对于 [3 3] 的窗口大小要快得多。

Matlab fast neighborhood operation

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

有没有其他方法可以用更大的窗口大小进行过滤?

非常感谢!

【问题讨论】:

    标签: matlab filtering mode large-data


    【解决方案1】:

    因此,您有一个由 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
    

    【讨论】:

    • 天啊。这很棒。速度似乎也没有随着窗口大小而显着增加。完美!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-19
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多