Tôi đang cố gắng sử dụng biến đổi Hough để phát hiện cạnh và muốn sử dụng hình ảnh gradient làm cơ sở.
Những gì tôi đã làm cho đến nay, do ảnh I
kích thước [M,N]
và hàm riêng của nó gx
, gy
là để tính toán góc gradient trong mỗi điểm ảnh như thetas = atan(gy(x,y) ./ gx
. Tương tự tôi tính độ lớn gradient là magnitudes = sqrt(gx.^2+gy.^2)
.
Để xây dựng biến đổi Hough, tôi sử dụng mã MATLAB sau:
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
Biến đổi Hough kết quả trông có vẻ hợp lý (xem http://i.stack.imgur.com/hC9mP.png ), nhưng khi tôi cố gắng sử dụng cực đại của nó làm tham số cạnh trong ảnh gốc, kết quả trông ít nhiều ngẫu nhiên. Tôi đã làm điều gì sai trong việc xây dựng biến đổi Hough?
CẬP NHẬT : Tôi đã có một lỗi ngu ngốc trong mã của mình: rho
được tính như x*cos(theta)+y*cos(theta)
thay vì x*cos(theta)+y*sin(theta)
. Đó là, tôi đã sử dụng hai cosin thay vì cosin và sin. Tôi đã chỉnh sửa mã ở trên và hình ảnh kết quả mới ở bên dưới. Điều này đã không cho các cạnh tốt hơn mặc dù.
@endolith: Để vẽ một cạnh, được cho một giá trị tối đa trong hough
-matrix tại rho_idx, theta_idx
, tôi dịch các chỉ số thành rho,theta
các giá trị:
theta = (theta_idx -1) / 100 * pi - pi / 2;
rho = rho_idx - max_rho;
Cuối cùng tôi vẽ cạnh như y= (rho - x*cos(theta)) / sin(theta)
.