Lil*_*ker 0 python opencv image-processing hough-transform
我正在尝试使用houghcircles()检测此裁剪图像中的小圆圈。我尝试更改其参数,但是当我将param2增加到50以上时,它会出错,而当其值小于100时,maxRadius也将出错。现在它可以运行,但性能不佳这是原始图像:

这是我的代码:
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()
Run Code Online (Sandbox Code Playgroud)
请,我应该如何更改参数?
如果尝试在不了解参数作用的情况下更改参数,则将需要很长时间来解决此问题。
这个描述是从这里
minDist:检测到的圆的中心(x,y)坐标之间的最小距离。如果minDist太小,则可能(错误地)检测到与原始对象相同邻域中的多个圆圈。如果minDist太大,则可能根本检测不到某些圆圈。
param1:Yuen等人中用于处理边缘检测的渐变值。方法。
param2:cv2.HOUGH_GRADIENT方法的累加器阈值。阈值越小,将检测到更多的圆圈(包括假圆圈)。阈值越大,可能会返回更多的圈子。
minRadius:半径的最小大小(以像素为单位)。
maxRadius:半径的最大大小(以像素为单位)。
您可以清楚地看到图像中的圆具有固定的半径,并且有最小的距离将它们隔开。如果设置了这两个,则可以改善结果。因此,阅读文档很重要。
关于您的问题,如果您有特殊需要使用Houghcircles,请继续进行微调。您可以做的改进是使用高斯模糊预处理,使用自适应阈值而不是仅阈值。
如果没有必要使用霍夫圆,我建议您改用轮廓。因为它更健壮,并且可以很好地归纳到不同的图像。这是我使用轮廓得到的结果。圆看起来较小,因为我使用腐蚀进行了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)
Run Code Online (Sandbox Code Playgroud)
希望这可以帮助 :)
| 归档时间: |
|
| 查看次数: |
5560 次 |
| 最近记录: |