我正在尝试使用霍夫变换进行边缘检测,并希望使用渐变图像作为基础。
到目前为止,我所做的,给定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)
. 也就是说,我使用了两个余弦而不是余弦和正弦。我已经编辑了上面的代码,新的结果图像在下面。不过,这并没有带来更好的优势。
hough
@endolith:要绘制一条边,给定 -matrix at的最大值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)
.