2019-6-24 opencv的霍夫变化(Hough transform)函数

本文介绍了如何使用OpenCV进行霍夫变换,包括检测直线的HoughLines和HoughLinesP函数,以及检测圆的HoughCircles函数。HoughLines用于检测直线,HoughLinesP则更高效,检测线段。HoughCircles用于检测圆。文章还提及了在Scikit-Image库中检测椭圆的方法。
摘要由CSDN通过智能技术生成

关于霍夫变化,网上有多理论介绍,随便找一篇https://www.cnblogs.com/AndyJee/p/3805594.html
它是是图像处理中从图像中识别几何形状的基本方法之一,其本质是将直角坐标系映射到极坐标系。

直线可以表示为y=mx+c,或者以极坐标形式表示为r=xcosθ+ysinθ,其中r是原点到直线的垂直距离,θ是水平轴顺时针方向到垂直线的夹角(这个方向取决于坐标的形式,在OpenCV就是采用这种极坐标形式)。

在这里插入图片描述
最基本的霍夫变换是从黑白图像中检测直线,同时也可以用来检测图像中简单的结构。
要想自己实现霍夫变化,可以参考https://blog.csdn.net/ccxcau/article/details/7816588。
大致思路如下:

  1. 读取图像
  2. 获取图像空间的源像素数据
  3. 通过量化霍夫参数空间为有限个值间隔等分或者累加格子,即p,theta
  4. 霍夫变换算法开始,每个像素坐标点P(x, y)被转换到(r, theta)的曲线点上面,并累加到对应的格子数据点
  5. 寻找最大霍夫值,设置阈值,反变换到图像空间;

我只是想学习opencv自带的霍夫变化函数而已,不用研究那么复杂。

检测直线

OpenCV中提供了函数HoughLines 和 HoughLinesP来检测直线。
官网说明参见https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_imgproc/py_houghlines/py_houghlines.html

  • 标准霍夫线变换:HoughLines,它能给我们提供一组参数对(ρ,θ)的集合来表示检测到的直线
HoughLinesP(image, rho, theta, threshold[, lines[, minLineLength[, maxLineGap]]]) -> lines

参数说明

  1. image:表示边缘检测的输出图像,该图像为单通道8位二进制图像。进行霍夫变换之前要进行二值化(由非0像素表示)或者canny边缘检测。
  2. rho:表示参数极径 r 以像素值为单位的分辨率。
  3. theta:表示参数极角 \theta 以弧度为单位的分辨率。
  4. threshold:表示检测一条直线所需最少的曲线交点。只有当累加器中的值高于threshold时才被当成是直线
  5. lines:表示储存着检测到的直线的参数对 (x_{start}, y_{start}, x_{end}, y_{end}) 的容器,也就是线段两个端点的坐标。
  6. minLineLength:表示能组成一条直线的最少点的数量,点数量不足的直线将被抛弃。
  7. maxLineGap:表示能被认为在一条直线上的亮点的最大距离。

直接使用官网的例子来测试一下,图片是在百度中搜索获得的。

import cv2
import numpy as np

img = cv2.imread('hough_test1.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) # rho=1,theta=np.pi/180
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.imshow('Result', img)
cv2.waitKey(0)
cv2.imwrite('houghlines3.jpg',img)

执行一下
在这里插入图片描述

左边原图,右边执行效果,不过只有一根线。

观察lines.shape,可以了解它是一个三维数组。其中10表示代表检测到10条直线。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值