别人没那么重要,我也没那么重要,好好活着,把能做的小事做好,够不到的东西就放弃,承认就好。做一个心情好能睡着的人,你所有事情都会在正轨上。

PythonOpenCV-边缘和轮廓-霍夫变换

0. 简介

  霍夫变换用于在图像中查找直线和圆等形状。

 

1. 霍夫直线变换

  cv2.HoughLines()函数利用霍夫变换算法检测图像中的直线,其基本格式如下:

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

  参数说明:

lines :返回的直线

image:原图像,必须是 8 位的单通道二值图像,通常会在霍夫变换之前,对图像执行阈值处理或 Canny 边缘检测。

rho:距离的精度(以像素为单位 ),通常为 1

theta:角度的精度,通常使用 π / 180°,表示搜索所有可能的角度

threshold:阈值,值越小,检测出的直线越多

  代码示例:

import cv2 as cv
import numpy as np

src = cv.imread('./Image/qipan.jpg')
cv.imshow('src', src)
gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY)  # 转灰度
edges = cv.Canny(src, 50, 150)   # 边缘检测

# 霍夫直线检测
lines = cv.HoughLines(edges, 1, np.pi/180, 150)
dst = src.copy()
for line in lines:
    rho, theta = line[0]
    a = np.cos(theta)
    b = np.sin(theta)
    x0, y0 = a*rho, b*rho
    pt1 = (int(x0+1000*(-b)), int(y0+1000*(a)))  # 计算直线端点
    pt2 = (int(x0-1000*(-b)), int(y0-1000*(a)))
    cv.line(dst, pt1, pt2, (255, 0, 0), thickness=2)  # 绘制直线
cv.imshow('HoughLine', dst)  # 显示直线
cv.waitKey(0)

  运行结果:

     

  cv2.HoughLinesP()函数利用概率霍夫变换算法来检测图像中的直线,其基本格式如下:

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

  参数说明:

lines:返回的直线

image:原图像,必须是 8 位的单通道二值图像,通常会在霍夫变换之前,对图像执行阈值处理或 Canny 边缘检测

rho:距离的精度(以像素为单位 ),通常为1

theta:角度的精度,通常使用π  / 180°,表示搜索所有可能的角度

threshold:阈值,值越小,检测出的直线越多

minLineLength:可接受的直线的最小长度,默认值为 0

maxLineGap:共线线段之间的最大间隔,默认值为 0

  代码示例:

import cv2 as cv
import numpy as np

src = cv.imread('./Image/qipan.jpg')
cv.imshow('src', src)
gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY)  # 转灰度
edges = cv.Canny(src, 50, 150)   # 边缘检测

# 霍夫直线检测
lines = cv.HoughLinesP(edges, 1, np.pi/180, 1, minLineLength=100, maxLineGap=10)
dst = src.copy()
for line in lines:
    x1, y1, x2, y2 = line[0]
    cv.line(dst, (x1, y1), (x2, y2), (0, 0, 255), 2)  # 绘制直线
cv.imshow('HoughLinesP', dst)  # 显示直线
cv.waitKey(0)

  运行结果:

      

 

2. 霍夫圆变换

  cv2.HoughCircles()函数利用霍夫变换查找图像中的圆,其基本格式如下:

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

  参数说明:

circles:返回的圆

image:原图像,必须是 8 位的单通道二值图像

method:查找方法,可设置为 cv2.HOUGH_GRADIENT和cv2.HOUGH_GRADIENT_ALT

dp:累加器分辨率,它与图像分辨率成反比。例如,如果 dp=1,则累加器与输入图像的分辨率相同;如果 dp =2,则累加器的宽度和高度是输入图像的一半

minDist:圆心间的最小距离

param1:对应 Canny 边缘测的高阈值(低阈值是高阈值的一半),默认值为 100

param2:圆心位置必须达到的投票数,值越大,检测出的圆越少,默认值为 100

minRadius:最小圆半径,半径小于该值的圆不会被检测出来。其默认值为 0,此时不起作用

maxRadius:最大圆半径,半径大于该值的圆不会被检测出来。其默认值为 0,此时不起作用

  代码示例:

import cv2 as cv
import numpy as np


src = cv.imread('./Image/qipan.jpg')
cv.imshow('src', src)
gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY)   # 转为灰度图
edges = cv.Canny(gray, 50, 150, apertureSize=3)  # 边缘检测

# 霍夫圆检测
circles = cv.HoughCircles(edges, cv.HOUGH_GRADIENT, 1, 50, param2=30, minRadius=10, maxRadius=40)
circles = np.uint16(np.around(circles))
dst = src.copy()
for i in circles[0, :]:
    cv.circle(dst, (i[0], i[1]), i[2], (255, 0, 0), 2)  # 画圆
    cv.circle(dst, (i[0], i[1]), 1, (0, 0, 255), 2)   # 画圆心
cv.imshow('HoughCircles', dst)
cv.waitKey(0)

  运行结果:

     

 

/*-------------------------------------------------------------------------------------------------------

笔者说明:

  该笔记来源于本人学习Python + OpenCv时的资料,

  分享出来只是为了供大家学习,并且为了自己以后想要用的时候方便寻找。

时间:2023年8月23日

------------------------------------------------------------------------------------------------------------*/

posted @ 2023-08-23 11:34  一路狂奔的乌龟  阅读(438)  评论(0)    收藏  举报
返回顶部