OpenCV 霍夫变换

文章目录

  • 一、霍夫直线变换
    • 1. cv2.HoughLines()
    • 1. cv2.HoughLinesP()
  • 二、霍夫圆环变化


        霍夫变化是一种在图像中寻找直线、圆形以及其他简单形状的方法。霍夫变换采用类似于投票的方式来获取当前图像内的形状集合,该变换由 Paul Hough(霍夫)1962 年首次提出。最初霍夫变换只能用于检测直线,经过发展后,霍夫变换不仅能识别直线,还能识别其他简单的图形结构,常见的有圆、椭圆等。


一、霍夫直线变换

    OpenCV 提供了函数 cv2.HoughLines()和函数 cv2.HoughLinesP()用来实现霍夫直线变换。

1. cv2.HoughLines()

    OpenCV 提供了函数 cv2.HoughLines() 用来实现霍夫直线变换,该函数要求所操作的源图像是一个二值图像,所以在进行霍夫变换之前要先将源图像进行二值化,或者进行 Canny 边缘检测。

函数 cv2.HoughLines() 的语法格式为:

    lines = cv2.HoughLines(image, rho, theta, threshold)

▪ image 是输入图像,即源图像,必须是8位的单通道二值图像。如果是其他类型的图像,再进行霍夫变换之前,需要将其修改为指定格式
▪ rho 为以像素为单位的距离r的进度。一般情况下,使用的进度是1
▪ theta 为角度θ的精度。一般情况下,使用的精度是π/180,表示要搜索所有可能的角度
▪ threshold 是阈值。阈值越小,就会得到较多的直线;阈值较大,就会得到较小的直线
▪ 返回值 lines 中的每一个元素都是一对浮点数,表示检测到的直线的参数,即(r,θ),是numpy.ndarray类型

   函数cv2.HoughLines() 检测到的图像中的直线而不是线段,因此检测到的直线是没有端点的。所以,我们在进行霍夫直线变换时所绘制的直线都是穿越整幅图像的。

代码如下(示例):

import cv2
import numpy as np
img = cv2.imread("12.png")  
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) # 转为灰度图 
edge = cv2.Canny (gray, 50, 150) # 画边框
lines=cv2.HoughLines(edge,1,np.pi/180,50) 
for line in lines:
    rho, theta = line[0]
    a = np.cos(theta)
    b = np.sin(theta) 
    x0 = rho*a
    y0 = rho*b
    x1= int(x0+1000*(-b))  # 这里的1000是为了求延长线,其他数值也可以
    y1=int(y0+1000*a) 
    x2=int(x0-1000*(-b)) 
    y2=int(y0-1000*a)
    cv2.line(img,(x1,y1),(x2,y2),(0,255,0),2) 
cv2.imshow("img ",img)
cv2.imshow("edge",edge) 
cv2.waitKey()
cv2.destroyAllWindows()t

OpenCV 霍夫变换_第1张图片

1. cv2.HoughLinesP()

  概率霍夫变换对基本霍夫变换算法进行了一些修正,是霍夫变换算法的优化。他没有考虑所有的点。相反,他只需要一个足以进行线检测是随机点集合即可。

函数 cv2.HoughLines() 的语法格式为:

    lines = cv2.HoughLinesP(image, rho, theta, threshold, minLineLength, maxLineGap)

▪ minLineLength 用来控制“接受直线的最小长度”的值,默认为0
▪ maxLineGap 用来控制接受共线线段之间的最小间隔,即在一条线中两点的最大间隔

代码如下(示例):

import cv2
import numpy as np
img = cv2.imread("12.png")  
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) # 转为灰度图 
edge = cv2.Canny (gray, 50, 150) # 画边框
minLineLength = 10
maxLineGap = 30
lines=cv2.HoughLinesP(edge,1,np.pi/180,50,minLineLength,maxLineGap ) 
for line in lines:
    x1,y1,x2,y2 = line[0]
    cv2.line(img,(x1,y1),(x2,y2),(0,255,0),2) 
cv2.imshow("img ",img)
cv2.imshow("edge",edge) 
cv2.waitKey()
cv2.destroyAllWindows()

OpenCV 霍夫变换_第2张图片

二、霍夫圆环变化

在 OpenCV 中,实现霍夫圆变换的是函数 cv2.HoughCircles() ,该函数将 Canny 边缘检测和霍夫变换结合。其语法格式为:

    circles= cv2.HoughCircles(image, method, dp, minDist, param1,param2,minRadius, maxRadius)

▪ method 该参数代表的是霍夫圆检测中两轮检测所使用的方法
▪ dp 累机器分辨率,他是一个分割比率,用来制定图像分辨率与圆心累加器分辨率的比例
▪ param1 该参数是缺省的,在缺省时默认值为100
▪ param2 圆心位置必须收到的投票数。只有在第一轮删选过程中,投票数超过该值的圆,才有资格进入第二轮删选
▪ minDist 圆心间的最小间距
▪ minRadius 圆半径的最小值
▪ maxRadius 圆半径的最大值
▪ circles 返回值,由圆心坐标和半径构成的 numpy.ndarray

代码如下(示例):

import cv2
import numpy as np
img = cv2.imread("12.png")  
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) # 转为灰度图 
edge = cv2.Canny (gray, 50, 150) # 画边框
circles=cv2.HoughCircles(edge,cv2.HOUGH_GRADIENT,1.30,50,param1=40,param2=20,\
										minRadius=5,maxRadius=100) 
if not circles is None:
    circles = np.uint16(np.around(circles))
    for circle in circles:
        x,y,r = circle[0]
        cv2.circle(img,(x,y),r,(0,0,255),2) 
cv2.imshow("img ",img)
cv2.imshow("edge",edge) 
cv2.waitKey()
cv2.destroyAllWindows()

OpenCV 霍夫变换_第3张图片

你可能感兴趣的:(python应用,机器视觉,opencv,python,计算机视觉,深度学习)