霍夫变换
应用范围
只要能用数学方程表示的形状,都能用霍夫变换检测到
直线检测
直线数学方程:或者,其中是原点到直线的距离,是距离与x轴的顺时针夹角。当直线在原点上方时,取负数,仍在
任何直线都可以由一组 霍夫直线
统计概率霍夫变换 Probabilistic Hough Transform
霍夫变换的优化
算法
- 随机获取边缘图像上的前景点,映射到极坐标系画曲线;
- 当极坐标系里面有交点达到最小投票数,将该点对应x-y坐标系的直线L找出来;
- 搜索边缘图像上前景点,在直线L上的点(且点与点之间距离小于maxLineGap的)连成线段,然后这些点全部删除,并且记录该线段的参数(起始点和终止点),当然线段长度要满足最小长度;
- 重复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)
霍夫圆检测
网友评论