我想做的事情是這樣的:如何在ruby-vips中實現maxfilter(給定的半徑)?
http://reference.wolfram.com/language/ref/MaxFilter.html
比方說我的形象有一個通道(灰度模式)。
我想做的事情是這樣的:如何在ruby-vips中實現maxfilter(給定的半徑)?
http://reference.wolfram.com/language/ref/MaxFilter.html
比方說我的形象有一個通道(灰度模式)。
下面是我如何用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
如果你不介意的方形窗口,你可以用一個排名過濾器做到這一點:
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
凡w
和h
是寬度和窗戶的高度。
當然,最大/最小值是可分離的,所以你也可以這樣寫:
result = image.rank(w, 1, w - 1).rank(1, h, h - 1)
這將是更快的半徑大。
窗戶形狀當然很重要。雖然這是一個有趣的方法。也許有可能表示一個半徑爲5的圓圈,因爲兩個重疊的3x5和5x3的矩形以某種方式組合了結果。不確定更大的半徑,但這可能比我的方法更快。 – Nakilon
這是一個聰明的想法。你需要爲多大的R工作? – user894763