import cv2
import numpy as np
from matplotlib import pyplot as plt__author__ = "zxsuperstar"
__email__ = "zxsuperstar@163.com""""
霍夫圆检测
"""
def detect_circle_demo(image):# dst = cv2.cv2.GaussianBlur(image,(3,3),0) #高斯滤波# cv2.imshow("dst",dst)#Mean Shift的优点就在于如果是像背景桌面的浅色纹理,# 图像分割的过程中相当于将这些小的浮动过滤掉,并且保留相对明显的纸张边缘# dst = cv2.bilateralFilter(src=image, d=0, sigmaColor=100, sigmaSpace=15) #高斯双边滤波dst = cv2.pyrMeanShiftFiltering(image,10,100) # 均值偏移滤波cimage = cv2.cvtColor(dst,cv2.COLOR_BGRA2GRAY)# ret, cimage = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)# cimage = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY, 3, 5)# cimage = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 3, 5)cv2.imshow("cimage",cimage)circle = cv2.HoughCircles(cimage, cv2.HOUGH_GRADIENT,1,200,param1=50,param2=30,minRadius=0,maxRadius=0)if not circle is None:circle = np.uint16(np.around(circle))print(circle)for i in circle[0,:]:cv2.circle(image,(i[0],i[1]),i[2],(0,0,255),2)# cv2.circle(image, (i[0], i[1]), 2, (255, 0, 0), 2)# cv2.namedWindow('circle', cv2.WINDOW_NORMAL)cv2.imshow("circle", image)if __name__ == "__main__":src = cv2.imread("./image/fp1.jpg") #blue green red# cv2.namedWindow("image", cv2.WINDOW_AUTOSIZE)# cv2.namedWindow('image', cv2.WINDOW_NORMAL)w ,h = src.shape[0:2]image = cv2.resize(src, (0, 0), fx=0.25, fy=0.25, interpolation=cv2.INTER_NEAREST)cv2.imshow("image",image)detect_circle_demo(image)cv2.waitKey(0)cv2.destroyAllWindows()
运行结果:
说明:
1.OpenCV的霍夫圆变换函数原型为:HoughCircles(image, method, dp, minDist[, circles[, param1[, param2[, minRadius[, maxRadius]]]]]) -> circles
image参数表示8位单通道灰度输入图像矩阵。
method参数表示圆检测方法,目前唯一实现的方法是HOUGH_GRADIENT。
dp参数表示累加器与原始图像相比的分辨率的反比参数。例如,如果dp = 1,则累加器具有与输入图像相同的分辨率。如果dp=2,累加器分辨率是元素图像的一半,宽度和高度也缩减为原来的一半。
minDist参数表示检测到的两个圆心之间的最小距离。如果参数太小,除了真实的一个圆圈之外,可能错误地检测到多个相邻的圆圈。如果太大,可能会遗漏一些圆圈。
circles参数表示检测到的圆的输出向量,向量内第一个元素是圆的横坐标,第二个是纵坐标,第三个是半径大小。
param1参数表示Canny边缘检测的高阈值,低阈值会被自动置为高阈值的一半。
param2参数表示圆心检测的累加阈值,参数值越小,可以检测越多的假圆圈,但返回的是与较大累加器值对应的圆圈。
minRadius参数表示检测到的圆的最小半径。
maxRadius参数表示检测到的圆的最大半径。
2.OpenCV画圆的circle函数原型:circle(img, center, radius, color[, thickness[, lineType[, shift]]]) -> img
img参数表示源图像。
center参数表示圆心坐标。
radius参数表示圆的半径。
color参数表示设定圆的颜色。
thickness参数:如果是正数,表示圆轮廓的粗细程度。如果是负数,表示要绘制实心圆。
lineType参数表示圆线条的类型。
shift参数表示圆心坐标和半径值中的小数位数。