【问题标题】:How do I implement maxfilter (with a given radius) in ruby-vips?如何在 ruby​​-vips 中实现 maxfilter(具有给定半径)?
【发布时间】:2017-11-25 10:39:34
【问题描述】:

我想做这样的事情:

http://reference.wolfram.com/language/ref/MaxFilter.html

假设我的图像有一个通道(灰度)。

【问题讨论】:

    标签: ruby image-processing filtering vips


    【解决方案1】:

    这是我使用 PI * R * R 卷积的方法。

    R = 2
    D = R + R + 1
    CIRCLE = Vips::Image.black(D, D).draw_circle(1, R, R, R, fill: true).to_a
    
    new_image = image
    D.times do |i|
      D.times do |j|
        next unless CIRCLE[i][j] == [1]
        t = image.conv Vips::Image.new_from_array Array.new(D){ [0]*D }.tap{ |t| t[i][j] = 1 }
        new_image = (new_image > t).ifthenelse(new_image, t)
      end
    end
    
    return new_image
    

    【讨论】:

      【解决方案2】:

      如果您不介意方形窗口,您可以使用排名过滤器来做到这一点:

      result = image.rank w, h, w * h - 1
      

      http://jcupitt.github.io/libvips/API/current/libvips-morphology.html#vips-rank

      http://www.rubydoc.info/gems/ruby-vips/Vips/Image#rank-instance_method

      其中wh 是窗口的宽度和高度。

      当然,max/min 是可分离的,所以你也可以这样写:

      result = image.rank(w, 1, w - 1).rank(1, h, h - 1)
      

      这对于大半径会更快。

      【讨论】:

      • 窗口形状当然很重要。虽然这是一种有趣的方法。也许可以将半径为 5 的圆表示为两个重叠的 3x5 和 5x3 矩形,并且以某种方式组合结果。不确定更大的半径,但这可能比我的方法更快。
      • 这是一个聪明的主意。您需要为多大的 R 工作?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-04
      • 1970-01-01
      • 2010-12-10
      • 2011-10-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多