美文网首页
OpenCV-Python学习(十六):霍夫变换

OpenCV-Python学习(十六):霍夫变换

作者: 星光下的胖子 | 来源:发表于2020-06-27 22:43 被阅读0次

目录:

  • 1.什么是霍夫变换?
  • 2.OpenCV中的霍夫线变换-->直线检测
  • 3.OpenCV中的霍夫圆变换-->圆检测

一、什么是霍夫变换?

霍夫变换(Hough Transform)是图像处理中的一种特征提取技术,来检测任意能够用数学公式表达的形状,即使这个形状被破坏或者有点扭曲。
霍夫变换将图像空间转变为参数空间,在参数空间中执行投票来决定物体的形状。

二、OpenCV中的霍夫线变换

OpenCV中的霍夫线变换步骤:

1.轮廓检测算法检测出轮廓
2.投射到Hough空间进行形状检测
  1)直线检测
    lines = cv2.HoughLines(image, rho, theta, threshold)

    参数: 
    image: 单通道的二进制图像
    rho: (ρ,θ)中ρ的精度。
    theta: (ρ,θ)中θ的精度。
    threshold: 阈值,(ρ,θ)对应的最低投票数。>=threshold被检测为一条线。
  2)圆检测
    circles = cv2.HoughCircles(image, method, dp, minDist, circles=None, param1=None, param2=None, minRadius=None, maxRadius=None)

    参数:
    method:定义检测图像中圆的方法。目前唯一实现的方法是HOUGH_GRADIENT。
    dp:累加器分辨率与图像分辨率的反比。
      dp=1,则累加器与输入图像具有相同的分辨率;dp=2,累加器有一半的宽度和高度。
    minDist:该参数是让算法能明显区分的两个不同圆之间的最小距离。
    param1 :用于Canny的边缘阀值上限,下限被置为上限的一半。
    param2:HOUGH_GRADIENT方法的累加器阈值(最低投票数)。阈值越小,检测到的圈子越多。
    minRadius :最小圆半径。
    maxRadius:最大圆半径。
1)直线检测

一条线可以表示为y=mx+c或以参数形式表示为ρ=xcosθ+ysinθ,其中ρ是从原点到该线的垂直距离,而θ是由该垂直线和水平轴形成的角度以逆时针方向测量(该方向随您如何表示坐标系而变化。此表示形式在OpenCV中使用)。查看下面的图片:

因此,如果线在原点下方通过,则它将具有正的ρ且角度小于180。如果线在原点上方,则将角度取为小于180,而不是大于180的角度。ρ取负值。任何垂直线将具有0度,水平线将具有90度。

示例:

# 1.直线检测
import cv2
import numpy

img = cv2.imread("image/2.jpg")

# 1.轮廓检测算法检测出轮廓
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray, 50, 150, apertureSize=3)

# 2.投射到Hough空间进行形状检测
# 任何一条线都可以用(ρ,θ)这两个术语表示。
# 1)先定义一个累加器,(ρ,θ)对应直线,ρ和θ都分别依次增大(根据精度),计算每对(ρ,θ)的投票数。
#    其中,ρ以像素为单位,θ以弧度为单位。rho和theta是ρ和θ的精度。
# 2)然后,根据threshold(阈值,最低投票数)来判断是否归为一条直线
lines = cv2.HoughLines(edges, 1, numpy.pi / 180, 100)

# 画线
for line in lines:
    rho, theta = line[0]
    a = numpy.cos(theta)
    b = numpy.sin(theta)
    x0 = rho * a
    y0 = rho * b
    # k1*k2=-1 ==> k2=-1/k1
    # k1 = tan(θ) ==> k2 = -1/tan(θ)=-cot(θ)
    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), 1)

cv2.imshow("img", img)
cv2.imshow("gray", gray)
cv2.imshow("edges", edges)
cv2.waitKey(0)
cv2.destroyWindow()

结果如下:

直线检测

二、OpenCV中的霍夫圆变换

2)圆检测

示例:

# 2.圆检测
import cv2
import numpy

img = cv2.imread("image/59.png")

# 1.轮廓检测算法检测出轮廓
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray, 50, 100)

# 2.投射到Hough空间进行形状检测
circles = cv2.HoughCircles(edges, cv2.HOUGH_GRADIENT, 1, 30, param1=40, param2=20, minRadius=5, maxRadius=100)

# 画圆
if not circles is None:
    # 转换为int
    circles = numpy.uint16(numpy.around(circles))
    for circle in circles:
        x, y, r = circle[0]
        # 画圆
        cv2.circle(img, (x, y), r, (0, 0, 255), 2)

cv2.imshow("gray", gray)
cv2.imshow("edges", edges)
cv2.imshow("img", img)
cv2.waitKey(0)
cv2.destroyWindow()

结果如下:

圆检测.png

相关文章

  • OpenCV-Python学习(十六):霍夫变换

    目录: 1.什么是霍夫变换? 2.OpenCV中的霍夫线变换-->直线检测 3.OpenCV中的霍夫圆变换-->圆...

  • Python+OpenCV教程17:霍夫变换

    主站:http://ex2tron.wang原文:Python+OpenCV教程17:霍夫变换 学习使用霍夫变换识...

  • 【OpenCV入门教程之十四】OpenCV霍夫变换:霍夫线变换,

    【OpenCV入门教程之十四】OpenCV霍夫变换:霍夫线变换,霍夫圆变换合辑文辑: https://blog.c...

  • 霍夫变换之直线检测

    霍夫变换 查看图像 结果: 边缘检测 结果: 霍夫变换检测直线 结果:

  • 霍夫变换

    霍夫变换——直线   Hough Line Transform用来做直线检测,前提是已经做了边缘检测。  霍夫变换...

  • 霍夫变换

    随机霍夫变换介绍[https://blog.csdn.net/zkl99999/article/details/4...

  • 霍夫变换

    一、霍夫直线检测 霍夫变换(Hough Transfrom),是1972年提出的,最开始就是用来在图像中检测直线,...

  • 霍夫变换

    基本原理 霍夫变换,是将座标由直角座标系变换到极座标系,然后再根据数学表达式检测某些形状(如直线和圆)的方法。当直...

  • 霍夫变换---OpenCV-Python开发指南(35)

    什么是霍夫变换 霍夫变换是一种在图像中寻找直线,圆形以及其他简单形状的方法。霍夫变换采用类似于投票的方式来获取当前...

  • 霍夫变换概述和标准霍夫变换

    在图像处理和计算机视觉领域中,如何冲当前的退选哪个中提取出所需要的特征信息是图像识别的关键所在。在许多应用场合中需...

网友评论

      本文标题:OpenCV-Python学习(十六):霍夫变换

      本文链接:https://www.haomeiwen.com/subject/darbfktx.html