我正在尝试使用霍夫变换进行边缘检测,并希望使用渐变图像作为基础。
我迄今所做,给出的图像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)
。也就是说,我使用两个余弦而不是一个余弦和一个正弦。我已经在上面编辑了代码,下面是新生成的图像。但是,这并没有提供更好的优势。
@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)
。