OpenCV+Python直线、圆检测

2018-07-15  本文已影响671人  音符纸飞机

霍夫变换

应用范围

只要能用数学方程表示的形状,都能用霍夫变换检测到

直线检测

直线数学方程:y=mx+c或者\rho=xcos\theta+ysin\theta,其中\rho是原点到直线的距离,\theta是距离与x轴的顺时针夹角。当直线在原点上方时,\rho取负数,\theta仍在[0,180^{\circ}]

直线方程
任何直线都可以由一组 霍夫直线

统计概率霍夫变换 Probabilistic Hough Transform

霍夫变换的优化

算法
  1. 随机获取边缘图像上的前景点,映射到极坐标系画曲线;
  2. 当极坐标系里面有交点达到最小投票数,将该点对应x-y坐标系的直线L找出来;
  3. 搜索边缘图像上前景点,在直线L上的点(且点与点之间距离小于maxLineGap的)连成线段,然后这些点全部删除,并且记录该线段的参数(起始点和终止点),当然线段长度要满足最小长度;
  4. 重复1. 2. 3.。
cv2.HoughLinesP(binary_img, rho, theta, threshold, minLineLength=None,maxLineGap=None)
# minLineLength 最短的直线长度
# maxLineGap 同一条直线上相邻的像素最远不超过的值
lines = cv2.HoughLinesP(edges,1,np.pi/180,100)

for line in lines:
    x1, y1, x2, y2 = line[0]
    cv2.line(img, (x1, y1), (x2, y2), (0, 255, 0), 1)

概率霍夫变换

霍夫圆检测

cv2.HoughCircles(gray_img, method, dp, min_dist, circles=None, param1=None, param2=None, minRadius=None, maxRadius=None)

"""
# method
#     HOUGH_GRADIENT 
#     HOUGH_MULTI_SCALE
#     HOUGH_PROBABILISTIC 
#     HOUGH_STANDARD
# dp : 累加器的精度 一半设为1
# min_dist: 圆心之间的最短距离,这是一个经验值。这个大了,那么多个圆就是被认为一个圆。
# param1, param2: CV_HOUGH_GRADIENT中的两个阈值. param1用于canny边缘检测时的max阈值 
#                param2设定了原检测的精度,值越大检测出的圆越少    
param2:根据你的图像中的圆大小设置,当这张图片中的圆越小,那么此值就设置应该被设置越小。
当设置的越小,那么检测出的圆越多,在检测较大的圆时则会产生很多噪声。所以要根据检测圆的大小变化
""" 
实例
img = cv2.imread('laugh.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
gray = cv2.bilateralFilter(gray, 21, 75, 75)
circles = cv2.HoughCircles(gray, cv2.HOUGH_GRADIENT, 1, 20,
                           param1=100, param2=20, minRadius=0)
circles = np.uint16(np.around(circles))
for i in circles[0, :]:
    # draw the outer circle
    cv2.circle(img, (i[0], i[1]), i[2], (0, 255, 0), 2)
    # draw the center of the circle
    cv2.circle(img, (i[0], i[1]), 2, (0, 0, 255), 3)
cv2.imshow("houghCircle", img)
霍夫圆检测
上一篇 下一篇

猜你喜欢

热点阅读