霍夫直线检测

霍夫(Hough)变换:

一条直线在直角坐标下可以用y=kx+b来表示,霍夫变换的主要思想是将该方程的参数和变量交换,即用x,y作为参数,k,b作为坐标变量,所以在直角坐标下的直线y=kx+b在参数坐标上表示为点(k,b),而直角坐标上的点(x1,y1)则在参数坐标下表示为一条直线。

算法描

hough空间与我们平时接触的笛卡尔坐标系不同,在笛卡尔坐标系中,直线垂直于X坐标时,其斜率无穷大,没有办法表示,为了计算方便,将参数空间的坐标表示为极坐标下的ρθ,因为同一直线上的点对应的(ρ, θ)是相同的,因此,可以先将图片进行边缘检测,然后对图像上每一个非零像素点,在参数坐标下变换为一条直线,那么在直线属于同一条直线的点便在参数空间形成多条直线并交于一点

原笛卡尔坐标系下的一个点对应霍夫空间的一条曲线,例如(1,1,),(2,2),(3,3)分别对应霍夫空间中的曲线P1=cos(θ)+sin(θ),P2=2cos(θ)+2sin(θ),P3=3cos(θ)+3sin(θ

他们相交的点在0-pi范围内,交点只有一个,这个交点(ρ, θ)就是笛卡尔坐标系中(1,1),(2,2),(3,3)所构成的直线的参数。

matlab代码实现:

%% 霍夫直线检测
function A=line_detection(im_edge)
[row,col]=size(im_edge); %图像大小
p_max=floor(sqrt((row)^2+(col)^2))+1; %原点到直线最远的距离,就是到图像右上角的距离
accumulation=zeros(p_max,180);
theta=[0:pi/180:pi];%角度
max_num=0;
A=0;
%遍历图像,统计映射的(P,theta),选取最大的统计量对应的角度
for n=1:row
    for m=1:col
        if(im_edge(n,m)==1)
            for k=1:180
                p=(m*cos(theta(k)))+(n*sin(theta(k)));
                p_int=round(p/2+p_max/2);
                accumulation(p_int,k)=accumulation(p_int,k)+1;
                if accumulation(p_int,k)>max_num
                    max_num=accumulation(p_int,k);
                    A=theta(k);
                end
            end
        end
    end
end






  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值