2017-11-25 2 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

whは幅です
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

ウィンドウの高さ。

もちろん

、最大/最小は分離可能であるので、あなたはまた、このように書くことができます。

大きな半径のためにはるかに高速になり
result = image.rank(w, 1, w - 1).rank(1, h, h - 1) 

+0

もちろん、ウィンドウの形状は重要です。これは面白い方法ですが。多分、3x5と5x3の2つのオーバーラップする矩形が何らかの形で結果を結合するので、半径5の円を表現することは可能です。より大きな半径についてはわかりませんが、これは私の方法よりも速くなる可能性があります。 – Nakilon

+0

それは巧妙な考えです。 Rの仕事量はどれくらいですか? – user894763

関連する問題