使用OpenCV和Python检测物体
我正在尝试用OpenCV和Python来检测下面图片中的白点。
我试过使用cv2.HoughCircles这个函数,但没有成功。
我需要用其他方法吗?
这是我的代码:
import cv2, cv
import numpy as np
import sys
if len(sys.argv)>1:
filename = sys.argv[1]
else:
filename = 'p.png'
img_gray = cv2.imread(filename,cv2.CV_LOAD_IMAGE_GRAYSCALE)
if img_gray==None:
print "cannot open ",filename
else:
img = cv2.GaussianBlur(img_gray, (0,0), 2)
cimg = cv2.cvtColor(img,cv2.COLOR_GRAY2BGR)
circles = cv2.HoughCircles(img,cv2.cv.CV_HOUGH_GRADIENT,4,10,param1=200,param2=100,minRadius=3,maxRadius=100)
if circles:
circles = np.uint16(np.around(circles))
for i in circles[0,:]:
cv2.circle(cimg,(i[0],i[1]),i[2],(0,255,0),1)
cv2.circle(cimg,(i[0],i[1]),2,(0,0,255),3)
cv2.imshow('detected circles',cimg)
cv2.waitKey(0)
cv2.destroyAllWindows()
3 个回答
0
我觉得中值滤波会让你的图像更好。你可以试试不同的核,比如3x3或者7x7的。然后再用一些(局部)阈值算法来提取形状。你可以使用HoughCircles方法,或者直接找轮廓,然后检查它们是否是圆形的。
0
首先,使用合适的阈值技术把图片转换成二值图像(可以试试Otsu方法,这个方法可能会有帮助)。接着,使用一些形态学操作,比如腐蚀,来把圆圈变小,这样你就可以更容易地找到它们的中心了。
1
如果你能在OpenCV中实现形态重建,那你就可以很简单地构建一个h-dome变换,这样可以大大简化任务。否则,简单地对高斯滤波进行阈值处理也可能足够了。
Binarize[FillingTransform[GaussianFilter[f, 2], 0.4, Padding -> 1]]
上面的代码中进行了高斯滤波,目的是有效地抑制输入图像边缘的噪声,否则在进行h-dome变换后,这些噪声会保留下来。
接下来是对高斯滤波后进行简单阈值处理的结果(Binarize[GaussianFilter[f, 2], 0.5]
),还有一个结果是通过Kapur的阈值方法直接二值化得到的(可以参考论文《使用直方图熵的新灰度图像阈值方法》,这篇论文其实已经有点年头了,是1985年的):
上面右边的图片在边缘有很多小点(在这个分辨率下看不太清楚),但这个方法是完全自动的。在这三种选项中,只有第二种方法已经在OpenCV中实现了。