直线检测
cv2.HoughLinesP()函数原型:
HoughLinesP(image, rho, theta, threshold, lines=None, minLineLength=None, maxLineGap=None)
- image: 必须是二值图像,推荐使用canny边缘检测的结果图像;
- rho:线段以像素为单位的距离精度,double类型的,推荐用1.0
- theta: 线段以弧度为单位的角度精度,推荐用numpy.pi/180
- threshod:累加平面的阈值参数,int类型,超过设定阈值才被检测出线段,值越大,基本上意味着检出的线段越长,检出的线段个数越少。根据情况推荐先用100试试
- lines:线条的输出向量。
- minLineLength:线段以像素为单位的最小长度。
- maxLineGap:同一方向上两条线段判定为一条线段的最大允许间隔(断裂),超过了设定值,则把两条线段当成一条线段,值越大,允许线段上的断裂越大,越有可能检出潜在的直线段
import cv2
import numpy as np
img = cv2.imread('lines.jpg')
# 灰度处理
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
# canny边缘处理
edges = cv2.Canny(gray,50,120)
line = 100
minLineLength = 20
# HoughLinesP函数是概率直线检测,注意区分HoughLines函数
lines = cv2.HoughLinesP(edges, 1, np.pi/180, 100, lines=line, minLineLength=minLineLength)
# 降维处理
lines1 = lines[:,0,:]
# line 函数勾画直线
# (x1,y1),(x2,y2)坐标位置
# (0,255,0)设置BGR通道颜色
# 2 是设置颜色粗浅度
for x1,y1,x2,y2 in lines1:
cv2.line(img,(x1,y1),(x2,y2),(0,255,0),2)
# 显示图像
cv2.imshow("edges", edges)
cv2.imshow("lines", img)
cv2.waitKey()
cv2.destroyAllWindows()
原图
效果图
直线的识别与HoughLinesP函数参数的设置有关
圆检测
HoughCircles函数原型
cv2.HoughCircles(image, method, dp, minDist, circles=None, param1=None, param2=None, minRadius=None, maxRadius=None)
参数说明:
- image- 8位,单通道,灰度输入图像。 method- 使用检测方法。
- dp - 累加器分辨率与图像分辨率的反比。例如,如果 dp= 1,则累加器具有与输入图像相同的分辨率。如果 dp = 2,则累加器的宽度和高度都是一半。
- minDist -检测到的圆的中心之间的最小距离。如果参数太小,除了真正的参数外,可能会错误地检测到多个邻居圈。如果太大,可能会错过一些圈子。
- circles- 找到的圆的输出向量。每个向量被编码为3元素的浮点向量 (x,y,半径)。
- param1 -第一个方法特定的参数。在CV_HOUGH_GRADIENT的情况下,
两个传递给Canny()边缘检测器的阈值较高(较小的两个小于两倍) - param2 -第二种方法参数。在CV_HOUGH_GRADIENT的情况下,它是检测阶段的圆心的累加器阈值。越小,可能会检测到越多的虚假圈子。首先返回对应于较大累加器值的圈子。
- minRadius -最小圆半径。
import cv2
import numpy as np
planets = cv2.imread('planet_glow.jpg')
# 灰度处理
gray_img = cv2.cvtColor(planets, cv2.COLOR_BGR2GRAY)
# medianBlur 平滑(模糊)处理
img = cv2.medianBlur(gray_img, 5)
# 灰度图像转彩色图像
cimg = cv2.cvtColor(img,cv2.COLOR_GRAY2BGR)
# 圆检测
circles = cv2.HoughCircles(img, cv2.HOUGH_GRADIENT, 1, 100, param1=100, param2=30, minRadius=50, maxRadius=100)
# 转化整数
circles = np.uint16(np.around(circles))
for i in circles[0,:]:
# 勾画圆形,planets图像、(i[0],i[1])圆心坐标,i[2]是半径
cv2.circle(planets,(i[0],i[1]),i[2],(0,255,0),2)
# 勾画圆心,圆心实质也是一个半径为2的圆形
cv2.circle(planets,(i[0],i[1]),2,(0,0,255),3)
# 显示图像
cv2.imwrite("planets_circles.jpg", planets)
cv2.imshow("mypic", cimg)
cv2.imshow("HoughCirlces", planets)
cv2.waitKey()
cv2.destroyAllWindows()
原图
效果图
圆的识别与HoughCircles函数参数的设置有关
注意:
例子可参考:Python 使用Opencv实现边缘检测以及轮廓检测的示例二
参考资料:OpenCV 3计算机视觉 Python语言实现第二版
欢迎加入学习交流QQ群:657341423直线检测 cv2.HoughLinesP()函数原型:HoughLinesP(image, rho, theta, threshold, lines=None, minLineLength=None, maxLineGap=None) image: 必须是二值图像,推荐使用canny边缘检测的结果图像; rho:线段以像素为单...
霍夫圆检测对噪声比较敏感,所有进行霍夫圆检测的时候要先进行中值滤波。
在OpenCV中是通过图像梯度来实现霍夫变换圆检测的,因此要选用cv2.HOUGH_GRADIENT这个参数。
其实现分为两步:
检测图像边缘,发现可能的圆心
从候选圆心中计算最佳半径大小
import cv2
import numpy as np
smarties = cv2.imread(r"F:\Python\pict...
内容来自OpenCV-Python Tutorials 自己翻译整理目标:使用霍夫变换在图像中寻找圆
使用函数cv2.HoughCircles()原理:圆形的表达式为(x−xcenter)2+(y−ycenter)2=r2(x-x_{center})^2+(y-y_{center})^2=r^2,一个圆环的确定需要三个参数。那么霍夫变换的累加器必须是三维的,但是这样的计算效率很低。
这里open
如何检测一个圆在多个圆内?
Circle Detection using OpenCV | Python
OpenCV #010 Circle Detection Using Hough Transform
Detecting overlapping circles
OpenCV Coin Detection Project
Counting blue and white bacteria colonies with Python and OpenC