3

我正在尝试使用 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()
4

3 回答 3

1

如果您可以在 OpenCV 中重现形态重建,则可以轻松构建 h-dome 变换,从而显着简化任务。否则,高斯滤波的简单阈值也可能就足够了。

在此处输入图像描述

Binarize[FillingTransform[GaussianFilter[f, 2], 0.4, Padding -> 1]]

在上面的代码中进行了高斯滤波,以有效抑制输入边界周围的噪声,否则在 h-dome 变换后会保留。

接下来是高斯滤波后的一个简单阈值的结果Binarize[GaussianFilter[f, 2], 0.5]( "(这不再是一种新方法,它是从 1985 年开始的)):

在此处输入图像描述 在此处输入图像描述

上图的右图在整个边界上都有很多小点(在这个图像分辨率下看不到),但是是全自动的。在这 3 个选项中,OpenCV 中仅存在第二个选项。

于 2013-02-08T17:26:13.177 回答
0

我认为中值滤波器会改善你的形象。尝试使用一些内核,3x3 或 7x7。然后,一些(本地)阈值算法将为您提供形状。您可以使用 HoughCircles,也可以只找到轮廓并检查它们的圆度。

于 2013-02-08T17:25:21.243 回答
0

使用合适的阈值技术将图像转换为二进制图像(Otsu 可能会有所帮助)。然后使用腐蚀等形态学操作使圆变小,然后您可以轻松找到它们的中心。

于 2013-02-08T17:25:55.873 回答