import cv2
import numpy as np
from matplotlib import pyplot as plt
__author__ = "zxsuperstar"
__email__ = "[email protected]"
"""
霍夫圆检测
"""
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参数表示圆心坐标和半径值中的小数位数。