目录
霍夫变换(Hough Transform):数字图像处理中的特征提取计数,判断图像中哪些点共线,可以检测直线、圆、椭圆。
1.数学理解(点共线问题-->线相交问题)
①x-y变量空间(y=kx+b)-->k-b参数空间(b=y-kx)
②x-y变量空间-->ρ-θ参数空间(ρ=xcosθ+ysinθ)
总结:x-y坐标系的一条直线(y=kx+b)对应ρ-θ坐标系的一个点(ρ,θ),x-y坐标系的一个点(x,y)对应ρ-θ坐标系的一条曲线(ρ=xcosθ+ysinθ)。
2.Hough变换算法实现
step1. 在参数空间(ρ,θ)里建立一个二维矩阵H(ρ,θ),初始化为0,ρ和θ分别表示横纵坐标;
step2. 对XY空间中的每一个给定点做Hough变换,求出其参数空间对应的所有(ρ,θ)点,即曲线(ρ=xcosθ+ysinθ),其中ρ和θ取整型;
step3. 在参数矩阵H每个点H(ρ,θ)处累加1,即H(ρ,θ)的值表示参数空间在该点(ρ,θ)处线相交的直线数,即XY空间共线的点数;
step4. 参数矩阵H最大值对应的坐标(ρ,θ)代表XY空间直线方程的参数。
3.Hough变换应用于线检测
step1. 对图像进行Hough变换;
step2. 找出变换域中的峰值数据(相交直线最多的点);
step3. 根据峰值数据的坐标绘出对应直线。
4. MATLAB工具
step1. hough函数执行霍夫变换,得霍夫矩阵;
step2. houghpeaks函数在霍夫矩阵中寻找峰值点;
step3. houghlines函数得二值图像中的直线信息。
[H,theta,rho] = hough(BW) %二值图像的Hough变换-检测直线
--rho=x*cos(theta)+y*sin(theta)
--x-y坐标系的一条直线(y=kx+b)对应ρ-θ坐标系的一个点(ρ,θ),x-y坐标系的一个点(x,y)对应ρ-θ坐标系的一条曲线(ρ=xcosθ+ysinθ)
--BW:输入二值图像(提取边缘后的)
--H:输出一个参数空间矩阵(hough变换后的累加器矩阵),行坐标-theta,列坐标-ρ
--theta:x轴与向量ρ的夹角θ(-90°<θ<90°),线条y=kx+b本身的角度是θ+90°
--rho:原点到直线y-kx+b的垂直距离ρ
peaks = houghpeaks(H, NumPeaks) %确定Hough变换中的峰值,即参数矩阵中累加的最大值
peaks = houghpeaks(..., 'Threshold', val1, 'NHoodSize', val2)
--H:输入Hough变换获得的参数矩阵
--NumPeaks:设定保留的最大峰值个数
--peaks :输出矩阵peaks ,记录H中保留峰值的横纵坐标
lines = houghlines(BW, theta, rho, peaks) %基于Hough变换提取直线段
lines = houghlines(..., 'FillGap', val1, 'MinLength', val2)
--BW:输入二值图(提取边缘后的,hough变化的输入)
--theta,rho:hough变换的结果(ρ,θ)
--peaks:houghpeaks结果
--lines:输出结构数组(可能检测到多条直线),长度等于找到的线段数。lines结构数组成员:
-point1:向量[r1,c1],指定线段起点行列坐标
-point2:向量[r2,c2],指定线段终点行列坐标
-theta:此线段的霍夫变换参数θ
-rho:此线段的霍夫变换参数ρ
MATLAB hough函数使用指南 :MATLAB 文档中心 - MathWorks 中国https://ww2.mathworks.cn/help/search.html?qdoc=hough&submitsearch=