【OpenCV-Python】18.OpenCV的图像轮廓——霍夫变换

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、数据科学、人工智能等文章后续会不定期发布,请大家多多关注,一键三连哟(●’◡’●)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

机器视觉小学徒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值