2017-11-25 118 views

回答

0

下面是我如何用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 
0

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

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是宽度和窗户的高度。

当然,最大/最小值是可分离的,所以你也可以这样写:

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

这将是更快的半径大。

+0

窗户形状当然很重要。虽然这是一个有趣的方法。也许有可能表示一个半径为5的圆圈,因为两个重叠的3x5和5x3的矩形以某种方式组合了结果。不确定更大的半径,但这可能比我的方法更快。 – Nakilon

+0

这是一个聪明的想法。你需要为多大的R工作? – user894763

相关问题