【问题标题】:Combine convolve filter in matlab在matlab中结合卷积滤波器
【发布时间】:2015-01-13 00:07:55
【问题描述】:

有没有办法将下面代码中的低通和高通滤波器组合成一个内核并应用一个 conv2() 函数?

注意:长度(lfilter)= 21,长度(hfilter)= 81。

我们在最后一步中所做的基本上是说从图像中移除大对象(在已经使用高斯模糊移除非常小的对象之后)。

properties (Constant)
    minStar = 2; % min star radius
    maxStar = 8; % max star radius
    threshold = 12;
end

    function filter2(this)
        normalize = @(x) x/sum(x);
        lfilter = normalize(exp(-((-ceil(5*this.minStar):ceil(5*this.minStar))/(2*this.minStar)).^2));
        hfilter = normalize(exp(-((-ceil(5*this.maxStar):ceil(5*this.maxStar))/(2*this.maxStar)).^2));
        this.low = conv2(lfilter',lfilter,this.raw,'same');
        this.high = conv2(hfilter',hfilter,this.raw,'same');
        this.filtered = this.low - this.high;
        this.foreground = this.filtered > this.threshold;
    end

【问题讨论】:

    标签: matlab convolution


    【解决方案1】:

    由于卷积算子是关联的:

    conv( a, conv(b,c) ) == conv( conv(a,b), c )
    

    您应该能够将两个内核组合成一个,只需将它们相互卷积即可。


    在你的情况下,这样的事情应该可以工作:

    new_kernel = conv2(lfilter',lfilter, conv2(hfilter',hfilter), 'same');
    

    卷积也是可交换的,因此执行卷积的顺序无关紧要。

    编辑:正如我在下面的评论中解释的那样,执行四个 1D 卷积的提问者的方法最终比单个 2D 卷积更快。

    【讨论】:

    • 我希望将过滤器合并到一个内核中。为了减少卷积的数量(我最终需要将它移植到 GPU)
    • 我明白了。使用许多 1D 过滤器而不是大型 2D 过滤器似乎是一个更好的主意。假设您拥有的所有一维过滤器都是带有N 分量的向量,并且图像是M 乘以M 像素,那么您的原始方法将需要4*N*M*M 乘法。如果我们假设新内核组合为N by N,我的实际上需要N*N*M*M
    • 是的,我想要内核可分离,gpu 喜欢,那个。刚刚发布了我得到的答案。
    【解决方案2】:

    我刚刚在 matlab 论坛上得到了答案。 http://www.mathworks.com/matlabcentral/answers/169713-combine-convolution-filters-bandpass-into-a-single-kernel

    要点是你必须使用填充来填充较短的过滤器的两侧,然后你可以组合向量。

    卷积是一种线性运算,所以是的,您可以将两个过滤运算合二为一。只需使过滤器大小相同并添加/减去它们。例如:

     lfilter = normalize(exp(-((-ceil(5*minStar):ceil(5*minmax))/(2*this.minStar)).^2));
     hfilter = normalize(exp(-((-ceil(5*maxStar):ceil(5*minmax))/(2*this.maxStar)).^2));
     padlength = (length(hfilter) - length(lfilter))/2;
     lfilter = padarray(lfilter, [0 padlength]);
     lhfilter = lfilter - hfilter;
     this.filtered = conv2(lhfilter',lhfilter,this.raw,'same');
    

    【讨论】:

      猜你喜欢
      • 2017-11-22
      • 1970-01-01
      • 2019-11-24
      • 1970-01-01
      • 1970-01-01
      • 2014-12-06
      • 2021-01-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多