霍夫变换是一种特征检测(feature extraction),被广泛应用在图像分析(image analysis)、计算机视觉(computer vision)以及数位影像处理(digital image processing)。霍夫变换是用来辨别找出物件中的特征,例如:线条。他的算法流程大致如下,给定一个物件、要辨别的形状的种类,算法会在参数空间(parameter space)中执行投票来决定物体的形状,而这是由累加空间(accumulator space)里的局部最大值(local maximum)来决定。
现在广泛使用的霍夫变换是由RichardDuda和PeterHart在公元1972年发明,并称之为广义霍夫变换(generalizedHoughtransform),广义霍夫变换和更早前1962年的PaulHough的专利有关。经典的霍夫变换是侦测图片中的直线,之后,霍夫变换不仅能识别直线,也能够识别任何形状,常见的有圆形、椭圆形。1981年,因为DanaH.Ballard的一篇期刊论文"Generalizing the Hough transform to detect arbitrary shapes",让霍夫变换开始流行于计算机视觉界。
从平面坐标到极坐标转换三个参数,C(x0, y0,r)其中x0, y0是圆心。
假设平面坐标的任意一个圆上的点,转换到极坐标中:C(x0, y0,r),处有最大值,霍夫变换正是利用这个原理实现圆的检测。
因为霍夫圆检测对噪声比较敏感,所以首先要对图
像做中值滤波。
基于效率考虑, Opencv中实现的霍夫变换圆检测
是基于图像梯度的实现,分为两步:
def detect_circle_demo(image):#霍夫圆检测
dst = cv.pyrMeanShiftFiltering(image,10,140)
cimage = cv.cvtColor(dst,cv.COLOR_BGR2GRAY)
circles = cv.HoughCircles(cimage,cv.HOUGH_GRADIENT,1,20,param1=50,param2=30,minRadius=0,maxRadius=0)
circles = np.uint16(np.around(circles))
for i in circles[0,:]:
cv.circle(image, (i[0], i[1]), i[2], (0, 0, 255), 2)
cv.circle(image, (i[0], i[1]), 2, (255, 0, 0), 2)
cv.imshow("circles",image)
完整代码:
import cv2 as cv
import numpy as np
def detect_circle_demo(image):#霍夫圆检测
dst = cv.pyrMeanShiftFiltering(image,10,95)
cimage = cv.cvtColor(dst,cv.COLOR_BGR2GRAY)
circles = cv.HoughCircles(cimage,cv.HOUGH_GRADIENT,1,20,param1=50,param2=30,minRadius=0,maxRadius=0)
circles = np.uint16(np.around(circles))
for i in circles[0,:]:
cv.circle(image, (i[0], i[1]), i[2], (0, 0, 255), 2)
cv.circle(image, (i[0], i[1]), 2, (255, 0, 0), 2)
cv.imshow("circles",image)
print("--------HEllow Python-------")
src = cv.imread("E:\picture/34.jpg")
cv.namedWindow("input image",cv.WINDOW_AUTOSIZE)
cv.imshow("input image",src)
detect_circle_demo(src)
cv.waitKey(0)
cv.destroyAllWindows()