私はエッジ検出にハフ変換を使用しようとしています、そして基礎として勾配画像を使用したいと思います。
私はこれまでやっていること、画像所与のI
サイズの[M,N]
とその偏導関数gx
、gy
、各画素の勾配角度を計算することですthetas = atan(gy(x,y) ./ gx
。同様に、勾配の大きさをとして計算しmagnitudes = sqrt(gx.^2+gy.^2)
ます。
ハフ変換を作成するには、次のMATLABコードを使用します。
max_rho = ceil(sqrt(M^2 + N^2));
hough = zeros(2*max_rho, 101);
for x=1:M
for y=1:N
theta = thetas(x,y);
rho = x*cos(theta) + y*sin(theta);
rho_idx = round(rho)+max_rho;
theta_idx = floor((theta + pi/2) / pi * 100) + 1;
hough(rho_idx, theta_idx) = hough(rho_idx, theta_idx) + magnitudes(x,y);
end
end
結果のハフ変換はもっともらしいようですが(http://i.stack.imgur.com/hC9mP.pngを参照)、元の画像のエッジパラメーターとして最大値を使用しようとすると、結果はだいたいランダムに見えます。ハフ変換の構築で何か問題がありましたか?
更新:私のコードで愚かな間違いがありました:ではなくrho
として計算されx*cos(theta)+y*cos(theta)
ましたx*cos(theta)+y*sin(theta)
。つまり、コサインとサインの代わりに2つのコサインを使用していました。上記のコードを編集し、新しい結果の画像を以下に示します。しかし、これははるかに良いエッジを与えませんでした。
@endolith:の最大値を考慮すると、エッジをプロットするhough
-マトリックスでrho_idx, theta_idx
私はインデックスを翻訳し、rho,theta
値:
theta = (theta_idx -1) / 100 * pi - pi / 2;
rho = rho_idx - max_rho;
最後に、エッジをとしてプロットしますy= (rho - x*cos(theta)) / sin(theta)
。