Hough-直线和圆的检测
1、直线检测
- HoughLines:使用标准的Hough变换
- HoughLinesP:使用概率Hough变换,之所以称之为概率版本的Hough变换是因为他只通过分析点的子集并估计这些点都属于一条直线的概率该函数的计算代价会少一些,执行会更块
HoughLines会接收一个有Canny边缘检测滤波器处理过的单通道二值图像(不一定需要Canny检测,但是一个经过去噪并只有边缘的图像当做Hough变换的输入会很不错,因此Canny滤波器是一个普遍的惯例)
HoughLinesP(edges, 1, np.pi/180, 100, minLineLength, maxLineGap)的参数:
- 需要处理的图像,(单通道的二值图像,黑白图,不是灰度图)
- 线段的几何表示,rho和theta,一般取1和np.pi/180
- 阈值。低于该阈值的直线会被忽略,达到阈值的直线才会被保留下来(可以理解为投票)
- 最小的线段长度,小于该长度的直线会被消除
- 最大的线段间隙,一条线段的间隙长度大于这个值会被视为是两条分开的直线
代码如下:
import cv2
import numpy as np
img = cv2.imread("../images/11.jpg")
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray,50,120)
minLength = 100
maxLineGap = 5
lines = cv2.HoughLinesP(edges,1,np.pi/180,100,minLength,maxLineGap)
# 画出所有的直线
c = len(lines)-1
while c >= 0:
for x1,y1,x2,y2 in lines[c]:
cv2.line(img,(x1,y1),(x2,y2),(0,0,255),4)
c -=1
cv2.imshow("edges",edges)
cv2.imshow("lines",img)
cv2.waitKey()
cv2.destroyAllWindows()
2、圆检测
HoughCircle()函数有:圆心间的最小距离、圆的最小和最大半径。
代码如下:
import cv2
import numpy
imge = cv2.imread("../images/12.jpg")
gray = cv2.cvtColor(imge,cv2.COLOR_BGR2GRAY)
img = cv2.Canny(gray,50,120)
cv2.imshow("canny",img)
circls = cv2.HoughCircles(img,cv2.HOUGH_GRADIENT,1,120,
param1=100,param2=30,minRadius=0,maxRadius=0)
for i in circls[:,-1]:
# 画出圆的边框
cv2.circle(imge,(i[0],i[1]),i[2],(0,255,0),2)
# 画出圆心的位置
cv2.circle(imge, (i[0], i[1]), 2, (0, 0, 255), 2)
cv2.imshow("houghcircle",imge)
cv2.waitKey()
cv2.destroyAllWindows()