我尝试使用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()
使用合适的阈值技术将图像转换为二进制图像(Otsu可能会有所帮助)。然后使用形态学操作,如腐蚀,使圆圈变小,然后你可以很容易地找到他们的中心。在
如果可以在OpenCV中重现形态重建,那么就可以轻松构建h-dome变换,从而大大简化了任务。否则,一个简单的高斯滤波阈值也就足够了。在
Binarize[FillingTransform[GaussianFilter[f, 2], 0.4, Padding -> 1]]
为了有效地抑制h-dome变换后输入边界附近的噪声,在上述代码中进行了高斯滤波。在
接下来是高斯滤波后的简单阈值结果(
Binarize[GaussianFilter[f, 2], 0.5]
),以及使用Kapur阈值化方法直接二值化得到的另一个结果(见论文“利用直方图熵进行灰度图像阈值化的新方法”(这不再是一种新方法,它来自1985年)):上面的右图在边界上有很多小点(在这个图像分辨率下看不到),但它是完全自动的。从这三个选项中,只有第二个选项已经存在于OpenCV中。在
我认为中值滤波可以改善你的形象。试着用一些3x3或7x7的内核做实验。然后,一些(局部)阈值算法将得到你的形状。你可以选择HoughCircles,也可以找到轮廓并检查其圆度。在
相关问题 更多 >
编程相关推荐