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日
------------------------------------------------------------------------------------------------------------*/