18.OpenCV的图像轮廓——霍夫变换
前言
霍夫变换用于在图像中查找直线和圆等形状。
一、霍夫直线变换
cv2.HoughLines()函数利用霍夫变换算法检测图像中的直线,其基本格式如下:
lines = cv2.HoughLines(image, rho, theta, threshold)
lines使用极坐标系来表示直线, 直线表达式为r = x*cosθ + y*sinθ
image为原图像, 必须是8位单通道二值图像, 通常会在霍夫变换之前, 对图像执行阈值处理或Canny边缘检测
rho位距离的精度(以像素为单位), 通常为1
theta为角度的精度, 通常使用 π/180°, 表示搜索所有的可能的角度
threshold为阈值, 值越小, 检测出来的直线越多
import cv2
import numpy as np
import matplotlib.pyplot as plt
# 利用霍夫变换算法检测图像中的直线
img = cv2.imread('shape6.jpg')
cv2.imshow('original', img)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray, 50, 150, apertureSize = 3)
cv2.imshow('Canny', edges)
#霍夫线变换
lines = cv2.HoughLines(edges, 1, np.pi / 180, 150)
#逐条绘制直线
img1=img.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)) ) #计算直线端点
cv2.line(img1, pt1, pt2, (0, 0,255), 2) #绘制直线
cv2.imshow('HoughLines',img1)
cv2.waitKey(0)
cv2.destroyAllWindows()

二、概率霍夫直线变换
cv2.HoughLinesP()函数利用概率霍夫变换算法检测图像中的直线,其基本格式如下:
lines =cv2.HoughLinesP(image, rho, theta, threshold[, minLineLength[, maxLineGap]])
lines为返回的直线是以(x1,y1,x2,y2)4个元素的向量为元素的列表, 其中(x1,y1)和(x2,y2)表示一条线段的起点和终点
image为原图像, 必须是8位单通道二值图像, 通常会在霍夫变换之前, 对图像执行阈值处理或Canny边缘检测
rho位距离的精度(以像素为单位), 通常为1
theta为角度的精度, 通常使用 π/180°, 表示搜索所有的可能的角度
threshold为阈值, 值越小, 检测出来的直线越多
minLineLength为可接受的直线的最小长度, 默认值为0
maxLineGap为共线线段之间的最大间隔, 默认值为0
# 利用概率霍夫变换算法检测图像中的直线
img=cv2.imread('shape6.jpg')
cv2.imshow('original',img)
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray,50,150,apertureSize =3)
cv2.imshow('Canny', edges)
#概率霍夫线变换
lines = cv2.HoughLinesP(edges, 1, np.pi/180, 1, minLineLength=100, maxLineGap=10)
#逐条绘制直线
img1 = img.copy()
for line in lines:
x1, y1, x2, y2 = line[0]
cv2.line(img1, (x1, y1), (x2, y2), (0, 0,255), 2)
cv2.imshow('HoughLines',img1)
cv2.waitKey(0)
cv2.destroyAllWindows()

三、霍夫圆变换
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, 此时不起作用
# 利用霍夫变换算法检测图像中的圆
img = cv2.imread('shape6.jpg')
cv2.imshow('original', img)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray, 50, 150, apertureSize = 3)
cv2.imshow('Canny', edges)
circles = cv2.HoughCircles(edges, cv2.HOUGH_GRADIENT, 1, 50, param2=30, minRadius=10, maxRadius=40)
circles = np.uint16(np.around(circles)) #把circles包含的圆心和半径的值变成整数。np.around()用法功能:四舍五入取值
img1=img.copy()
for i in circles[0,:]:
cv2.circle(img1,(i[0],i[1]),i[2],(255,0,0),2)
cv2.circle(img1,(i[0],i[1]),2,(0,0,255),2)
cv2.namedWindow('circles',cv2.WINDOW_NORMAL)
cv2.imshow('circles',img1)
cv2.waitKey(0)
cv2.destroyAllWindows()

四、OpenCV-Python资源下载
OpenCV-Python测试用图片、中文官方文档、opencv-4.5.4源码
总结
以上内容介绍了OpenCV-Python的霍夫变换检测直线与圆的方法,有关Python、数据科学、人工智能等文章后续会不定期发布,请大家多多关注,一键三连哟(●’◡’●)。

2617

被折叠的 条评论
为什么被折叠?



