Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用houghCircles(OpenCV)检测小圆_Python_Opencv_Image Processing_Hough Transform - Fatal编程技术网

Python 使用houghCircles(OpenCV)检测小圆

Python 使用houghCircles(OpenCV)检测小圆,python,opencv,image-processing,hough-transform,Python,Opencv,Image Processing,Hough Transform,我正在尝试使用houghcircles()检测此裁剪图像中的小圆圈。我试图更改它的参数,但当我将param2增加到50以上时,它会出错;当maxRadius的值小于100时,它也会出错。现在它运行,但性能不好 这是原始图像: 这是结果图: 这是我的代码: from imutils.perspective import four_point_transform from imutils import contours import numpy as np import argparse imp

我正在尝试使用houghcircles()检测此裁剪图像中的小圆圈。我试图更改它的参数,但当我将param2增加到50以上时,它会出错;当maxRadius的值小于100时,它也会出错。现在它运行,但性能不好 这是原始图像:

这是结果图:

这是我的代码:

from imutils.perspective import four_point_transform
from imutils import contours
import numpy as np
import argparse
import imutils
import cv2

im = cv2.imread('crop.png')
imgray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)
ret,thresh = cv2.threshold(imgray, 200, 255,cv2.THRESH_BINARY)
cimg = cv2.cvtColor(thresh,cv2.COLOR_GRAY2BGR)

c = cv2.HoughCircles(thresh, cv2.HOUGH_GRADIENT, 0.5, 41, param1=70, 
param2=30, minRadius=10,maxRadius=175)
c = np.uint16(np.around(c))

for i in c[0,:]:
    # draw the outer circle
    cv2.circle(cimg,(i[0],i[1]),i[2],(0,255,0),2)
    # draw the center of the circle
    cv2.circle(cimg,(i[0],i[1]),2,(0,0,255),3)

cv2.namedWindow('img',cv2.WINDOW_NORMAL)
cv2.resizeWindow('img', 800,800)
cv2.imshow('img',cimg)
cv2.waitKey(0)
cv2.destroyAllWindows()

请问,我应该如何更改参数?

如果您试图在不了解参数作用的情况下更改参数,则需要很长时间才能解决此问题

此描述来自

minDist:检测到的圆的中心(x,y)坐标之间的最小距离。如果正念者太小,则会有多个圆圈 可能(错误地)检测到与原始邻域相同的邻域。如果 Mindsist太大,则可能根本无法检测到某些圆圈

param1:Yuen等人方法中用于处理边缘检测的梯度值

参数2:cv2.HOUGH_梯度法的累加器阈值。阈值越小,圆圈就越多 检测到(包括假圆)。阈值越大,则越大 可能会返回更多的圆圈

minRadius:半径的最小大小(以像素为单位)

maxRadius:半径的最大大小(以像素为单位)

您可以清楚地看到,图像中的圆具有固定的半径,并且它们之间的距离最小。如果设置这两个参数,则可以改进结果。因此,阅读文档很重要

关于你的问题,如果你有使用Houghcircles的特殊必要性,请继续并微调它。您可以做的改进是,使用gaussianblur进行预处理,使用adaptivethreshold而不仅仅是threshold

如果没有必要使用霍夫圆,我建议您使用轮廓代替。因为它更健壮,可以很好地推广到不同的图像。这是我用等高线得到的结果。这些圆看起来更小,因为我已经使用了6次腐蚀迭代和3次膨胀迭代

这是我使用的代码

import numpy as np
import cv2

image_color= cv2.imread("Ye3gs.png")
image_ori = cv2.cvtColor(image_color,cv2.COLOR_BGR2GRAY)

lower_bound = np.array([0,0,10])
upper_bound = np.array([255,255,195])

image = image_color

mask = cv2.inRange(image_color, lower_bound, upper_bound)

# mask = cv2.adaptiveThreshold(image_ori,255,cv2.ADAPTIVE_THRESH_MEAN_C,\
#             cv2.THRESH_BINARY_INV,33,2)

kernel = np.ones((3, 3), np.uint8)

#Use erosion and dilation combination to eliminate false positives. 
#In this case the text Q0X could be identified as circles but it is not.
mask = cv2.erode(mask, kernel, iterations=6)
mask = cv2.dilate(mask, kernel, iterations=3)

closing = cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel)

contours = cv2.findContours(mask.copy(), cv2.RETR_EXTERNAL,
        cv2.CHAIN_APPROX_SIMPLE)[0]
contours.sort(key=lambda x:cv2.boundingRect(x)[0])

array = []
ii = 1
print len(contours)
for c in contours:
    (x,y),r = cv2.minEnclosingCircle(c)
    center = (int(x),int(y))
    r = int(r)
    if r >= 6 and r<=10:
        cv2.circle(image,center,r,(0,255,0),2)
        array.append(center)

cv2.imshow("preprocessed", image_color)
cv2.waitKey(0)
将numpy导入为np
进口cv2
image\u color=cv2.imread(“Ye3gs.png”)
image\u ori=cv2.cvt颜色(image\u color,cv2.color\u bgr2灰色)
下界=np.数组([0,0,10])
上界=np.数组([255255195])
图像=图像颜色
掩码=cv2.inRange(图像颜色、下限、上限)
#掩码=cv2.自适应阈值(图像ori,255,cv2.自适应阈值平均值\
#cv2.THRESH_二进制_INV,33,2)
内核=np.ones((3,3),np.uint8)
#使用腐蚀和扩张组合消除假阳性。
#在这种情况下,文本Q0X可以标识为圆圈,但不是。
mask=cv2.腐蚀(mask,内核,迭代次数=6)
掩码=cv2.deflate(掩码,内核,迭代次数=3)
关闭=cv2.morphologyEx(掩码,cv2.MORPH_打开,内核)
轮廓=cv2.findContours(mask.copy(),cv2.RETR_外部,
cv2.链约简单[0]
sort(key=lambda x:cv2.boundingRect(x)[0])
数组=[]
ii=1
印刷透镜(轮廓)
对于等高线中的c:
(x,y),r=cv2。闭合圆(c)
中心=(整数(x),整数(y))
r=int(r)

如果OpenCV 3中的r>=6且r,则findContours的签名已更改。 要返回轮廓,您需要更改此线:

contours = cv2.findContours(mask.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[0]
对此

contours = cv2.findContours(mask.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[1]

感谢您的帮助,但它给了我一个错误:
contours.sort(key=lambda x:cv2.boundingRect(x)[0])TypeError:“key”是此函数的无效关键字参数
感谢我在添加此函数时所做的大量工作返回((原点[1]//公差系数)*公差系数)*cols+原点[0]
我建议使用轮廓+MineConclosingCircle函数,然后将圆边界/区域与检测到的轮廓进行比较,以过滤掉非圆contours@LilyBaker你能解释一下你是如何纠正打字错误的吗?我也得到了同样的结果。