霍夫变换c语言程序,霍夫变换 | Cauthy's Blog

本文介绍了霍夫变换在检测直线、圆和椭圆中的应用,详细阐述了算法流程,并提供了C语言实现示例。针对噪声和效率问题,讨论了改进策略,包括考虑边缘点的梯度方向和采用广义霍夫变换。最后对比了霍夫变换与最小二乘法的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最早接触霍夫变换(Hough Transform )[4,5,6,7,8]就是用在检测直线,大四的时候用来分割ROI用的,原理看起来很简单。

一.检测直线

直线y=k*x+b上一点(x0,y0),满足方程y0=k*x0+b。那么换过来看,在坐标系(k,b)上,这就是一条直线,即b=- x0* k+ y0;再来直线上的一点(x1,y1),同样满足y1=k*x1+b,那么在(k,b)坐标系上就是另外一条直线,即b=-x1*k+y1;这两条直线的交点就是(k,b),即为(x,y)平面的斜率和截距。

(x,y)平面上的一条直线映射到(k,b)平面就变成一个点了。

为了解决k为无穷大的问题以及如果采用(k,b)矩阵,参数范围会比较庞大(k和b的范围不好取),采用极坐标表示x*cos(theta) + y*sin(theta)=r,这样r就固定在x,y对角线范围内,角度可以设置为0到180°。程序关键在于步长怎么确定,太密了时间长,太稀疏了,可能找不到最大值。

1.  算法流程为:

1)       初始化累加器H为零

2)       遍历图像中每个边缘点

for theta = 0 to 180

r=x*cos(theta) + y*sin(theta)

H(theta,r) = H(theta,r)+1;

end

3)       H中最大的值对应的theta和r就是要求的直线(实际使用的时候可以设定最大值的阈值)

Code:

M = imread(‘sqr1.gif’);

if size(M,3) == 3

M1=rgb2gray(M);

else

M1=M;

end

BW = edge(M1,’canny’);

[sy,sx]=size(I);

[y,x]=find(I);

totalpix = length(x);

maxrho = round(sqrt(sx^2 + sy^2)); %Rou的最大坐标

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值