数字图像处理—图像分割—哈夫(Hough)变换及哈夫变换原理—检测直线

1、检测直线

n个点在一条直线上,连续的满足直线方程;同样,离散的也满足直线方程。


直线解决方法:先确定所有有任意2点决定的直线(需约次运算以确定n(n - 1)/ 2条线)。在找出接近具体直线的点的集合(需约次运算以比较n个点中的每一个与n(n - 1)/ 2条直线中的每一条),这样计算量太大。


☞哈夫变换的方法:可用较少的计算量来解决这个问题。

哈夫变换利用点—线的对偶性(duality)

(1)在图像空间中共线的点对应在参数空间里相交的线。

(2)在参数空间中相交于同一个点的所有直线在图像空间里,有共线的点与之对应。


图像空间XY中过点的直线上的每一点都对应在参数空间PQ里的一条直线,这些直线相较于点(p’,q‘)。


☞哈夫变换检测直线的具体实现原理(过程):


●在参数空间PQ里建立一个两维的累加数组。设这个累加数组为A(p,q),其中[Pmin,Pmax]和[Qmin,Qmax]分别为预期的斜率和截距的取值范围。

●开始时置数组A为零,然后对每一个图像空间中的给定点(x,y),让p取遍P轴上所有可能的值,并算出对应的q = -px + y。(x,y固定)

●再根据p和q的值(设都已经取整)对A累加:A(p, q) = A(p,q)+1。

●累加结束后,根据A(p,q)处共线点的个数。同时(p,q)值也给出了直线方程的参数,使我们得到了点所在直线的方程。

●如果共线,则有相同的p,q,A(p,q)则可以不断累加。


☞哈夫变换在极坐标下检测直线(能检测垂直于X轴的曲线,θ为90°)

●如果直线接近竖直方向,会由于p和q的值都接近无穷而使计算量大增,此时可用直线的极坐标方程:

●根据这个方程,原图像空间中的点对应新参数空间中的一条正弦曲线,即原来的点—直线对偶性变成了现在的点—正弦曲线对偶性。

●检测在图像空间中共点的线需要在参数空间里检测正弦曲线的交点。

●具体就是让θ取遍θ轴上所有可能的值,并算出对应的ρ,再对累加数组A累加,有A的数值得到共线点的个数,这里在参数空间建立累加数组的方法与上述类似。

可怜累啊累~

哈夫变换是一种常用的图像处理技术,用于检测图像中的直线。在Python中,你可以使用OpenCV库来实现哈夫变换。 首先,确保你已经安装了OpenCV库。你可以使用以下命令来安装: ``` pip install opencv-python ``` 然后,你可以按照以下步骤来实现哈夫变换检测图像中的直线: 1. 导入所需的库: ```python import cv2 import numpy as np ``` 2. 读取图像并转换为灰度图像: ```python image = cv2.imread('image.jpg') gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) ``` 3. 进行边缘检测: ```python edges = cv2.Canny(gray, 50, 150, apertureSize=3) ``` 4. 运行哈夫变换检测直线: ```python lines = cv2.HoughLines(edges, 1, np.pi/180, threshold=100) ``` 5. 绘制检测到的直线: ```python if lines is not None: for line in lines: rho, theta = line[0] a = np.cos(theta) b = np.sin(theta) x0 = a * rho y0 = b * rho x1 = int(x0 + 1000 * (-b)) y1 = int(y0 + 1000 * (a)) x2 = int(x0 - 1000 * (-b)) y2 = int(y0 - 1000 * (a)) cv2.line(image, (x1, y1), (x2, y2), (0, 0, 255), 2) ``` 6. 显示结果: ```python cv2.imshow('Hough Lines', image) cv2.waitKey(0) cv2.destroyAllWindows() ``` 以上代码会检测图像中的直线并将其绘制在原始图像上。你可以根据需要进行调整和修改。注意,这是一个基本的实现示例,可能无法检测到所有直线或者可能会检测到一些误检的直线。你可以根据具体情况进行参数调整以达到更好的效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值