opencv-霍夫线变换

参考:

1、http://docs.opencv.org/3.3.0/  官方文档api

2、http://docs.opencv.org/3.3.0/d6/d00/tutorial_py_root.html 官方英文教程

3、https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_tutorials.html

4、https://github.com/makelove/OpenCV-Python-Tutorial# 进阶教程

5、https://docs.opencv.org/3.3.0/index.html  官方英文教程

6、https://github.com/abidrahmank/OpenCV2-Python-Tutorials

7、https://www.learnopencv.com/

8、http://answers.opencv.org/questions/ OpenCV论坛

9、https://github.com/opencv/opencv   官方github

10、https://github.com/abidrahmank/OpenCV2-Python-Tutorials


注:安装的版本 opencv_python-3.3.0-cp36-cp36m-win_amd64.whl



参考:https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_tutorials.html


目标

In this chapter,
  • We will understand the concept of Hough Tranform.
  • We will see how to use it detect lines in an image.
  • We will see following functions: cv2.HoughLines()cv2.HoughLinesP()

OpenCV中的霍夫线变换

上面解释的一切都封装在OpenCV函数cv2.HoughLines()中。 它只返回一个数组 (\rho, \theta)值。\rho以像素为单位测量,θ以弧度测量。 第一个参数,输入图像应该是一个二进制图像,因此在应用霍夫变换之前应用阈值或使用canny边缘检测。 第二和第三参数分别为\rho and \theta。 第四个参数 threshold,这意味着它应该被视为一条线的最小投票。 记住,票数取决于线上的点数。 因此,它代表应检测的最小线路长度。


import cv2
import numpy as np

img = cv2.imread('dave.jpg')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray,50,150,apertureSize = 3)

lines = cv2.HoughLines(edges,1,np.pi/180,200)
for rho,theta in lines[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(img,(x1,y1),(x2,y2),(0,0,255),2)

# cv2.imwrite('houghlines3.jpg',img)
cv2.imshow('img',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
Hough Transform Line Detection


概率霍夫变换

在hough变换中,你可以看到即使是一个有两个参数的行,它需要大量的计算。 概率霍夫变换是我们看到的霍夫变换的优化。 它不考虑所有要点,而只采取点的随机子集,并且足以用于线检测。 只是我们必须降低门槛。 参见下图,比较霍夫变换和概率霍夫变换在霍夫空间。 (图片提供:Franck Bettinger的主页 


OpenCV实现基于 Robust Detection of Lines Using the Progressive Probabilistic Hough Transform by Matas, J. and Galambos, C. and Kittler, J.V..。使用的函数是cv2.HoughLinesP()。 它有两个新的论点。

  • minLineLength - 最小线长。 短于此的线段被拒绝。
  • maxLineGap - 线段之间允许的最大间隔,将它们视为单行。

最好的是,它直接返回两个端点。 在以前的情况下,你只得到线的参数,你必须找到所有的点。 在这里,一切都是直接和简单的。


import cv2
import numpy as np

img = cv2.imread('dave.jpg')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray,50,150,apertureSize = 3)
minLineLength = 100
maxLineGap = 10
lines = cv2.HoughLinesP(edges,1,np.pi/180,100,minLineLength,maxLineGap)
for x1,y1,x2,y2 in lines[0]:
    cv2.line(img,(x1,y1),(x2,y2),(0,255,0),2)

# cv2.imwrite('houghlines5.jpg',img)

cv2.imshow('img',img)
cv2.waitKey(0)
cv2.destroyAllWindows()


Additional Resources

  1. Hough Transform on Wikipedia


<think>好的,用户想用OpenCV-Python实现霍夫变换来检测图像中的矩形。首先,我需要回忆一下霍夫变换的相关知识。霍夫变换通常用于检测直线和圆形,检测矩形可能需要结合直线检测和一些后处理步骤。 用户提供的参考内容里提到了轮廓检测和直线检测,比如使用cv2.findContours和cv2.HoughLines。这可能对解决问题有帮助。首先,应该考虑图像预处理,比如灰度化、边缘检测。Canny边缘检测是常用的方法,参考内容里也有提到。 接下来,使用霍夫直线检测来找到图像中的直线。OpenCV的HoughLines或HoughLinesP函数可以检测直线,其中HoughLinesP是概率霍夫变换,效率更高,适合实时应用。检测到直线后,需要将这些直线组合成矩形。这可能需要计算直线的交点,或者寻找四边形的轮廓。 不过,用户提到的是检测矩形,或许另一种方法是先检测所有轮廓,然后筛选出四边形的轮廓,并进一步验证其是否为矩形。参考内容中的cv2.findContours和轮廓近似方法可能适用。比如,使用cv2.approxPolyDP来近似轮廓,如果近似后的轮廓有四个顶点,且角度接近直角,则可以认为是矩形。 需要结合两种方法:霍夫变换检测直线,然后找出四条直线形成矩形;或者使用轮廓检测直接找四边形。用户明确提到霍夫变换,所以可能需要优先考虑直线检测的方法。但霍夫变换检测直线后如何组合成矩形,这可能需要计算直线的交点和角度,找出相互垂直且闭合的四边形。 同时,注意图像预处理的重要性,比如降噪、二值化等,参考内容里提到使用二值化来提取硬币轮廓,可能同样适用于矩形检测。此外,处理后的边缘图像质量直接影响霍夫变换的效果。 然后,编写代码步骤可能包括:读取图像,转为灰度,高斯模糊,Canny边缘检测,霍夫变换检测直线,处理直线数据,寻找四个边组成矩形,绘制结果。或者,检测所有直线后,通过筛选水平和垂直的直线,再组合成矩形。 需要注意的是,霍夫变换可能会检测到很多直线,如何筛选出构成矩形的四条是一个挑战。可能需要计算直线之间的交点和角度关系,或者使用其他几何条件来过滤。 另外,用户提供的引用中提到cv.RETR_EXTERNAL和轮廓填充,这可能与轮廓检测方法相关。如果使用轮廓检测,步骤可能更简单:找到轮廓,近似多边形,筛选四个点的轮廓,计算角度是否为直角,面积是否足够大等。 不过用户明确要求使用霍夫变换,所以可能需要将两种方法结合,比如用霍夫检测直线,然后找到四个直线形成矩形,或者用霍夫检测矩形的方法。不过OpenCV中是否有直接的霍夫矩形检测函数?我记得HoughLines和HoughLinesP主要用于直线,而矩形检测可能需要其他处理。 综合以上思考,解决方案可能是:预处理图像,检测边缘,使用霍夫变换检测直线,然后通过直线之间的几何关系筛选出可能的矩形边,最后验证并绘制矩形。或者,检测直线后,寻找闭合的四边形。 现在需要将这些步骤转化为具体的代码示例,并确保正确引用用户提供的参考资料中的方法,比如使用cv2.findContours中的参数,或者边缘检测的处理步骤。同时,注意回答的结构,按照用户的要求,分步骤说明,并生成相关问题。</think>以下是用OpenCV-Python实现霍夫变换检测矩形的分步说明: ### 霍夫变换检测矩形步骤 1. **图像预处理** ```python import cv2 import numpy as np # 读取图像并转为灰度 img = cv2.imread('rect.jpg') gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 高斯模糊降噪 blur = cv2.GaussianBlur(gray, (5,5), 0) # Canny边缘检测(参数根据实际情况调整) edges = cv2.Canny(blur, 50, 150) ``` 2. **霍夫直线检测** ```python # 概率霍夫变换检测直线 lines = cv2.HoughLinesP(edges, rho=1, theta=np.pi/180, threshold=50, minLineLength=50, maxLineGap=10) # 绘制所有检测到的直线 if lines is not None: for line in lines: x1,y1,x2,y2 = line[0] cv2.line(img, (x1,y1), (x2,y2), (0,255,0), 2) ``` 3. **直线后处理(关键步骤)** - **筛选水平和垂直线**:计算直线角度,保留0°、90°、45°等特定角度的直线 - **寻找交点**:通过直线方程计算交点,组合成四边形 - **几何验证**:验证四边形内角是否接近90°,边长比例是否符合矩形特征 4. **替代方案:轮廓检测法** ```python # 查找轮廓并筛选矩形 contours, _ = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) for cnt in contours: # 轮廓近似 epsilon = 0.02*cv2.arcLength(cnt,True) approx = cv2.approxPolyDP(cnt,epsilon,True) # 筛选四边形 if len(approx) == 4: # 计算角度验证直角 cv2.drawContours(img, [approx], 0, (0,0,255), 3) ``` 5. **结果显示** ```python cv2.imshow('Result', img) cv2.waitKey(0) cv2.destroyAllWindows() ``` > 注意:实际应用中需要根据具体图像调整参数,建议结合两种方法: > 1. 先用霍夫变换检测直线 > 2. 再用轮廓分析验证几何特征[^2]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值