在图像上查找硬币

Find coins on image

我正在尝试在不同的图像中找到硬币并标记它们的位置。硬币总是完美的圆形(不是椭圆形),但它们可以相互接触甚至重叠。 Here 是一些示例图像,以及我尝试的结果(一个 Python 使用 skimage 及其输出的脚本),但它似乎表现不佳。

脚本:

def edges(img, t):
    @adapt_rgb(each_channel)
    def filter_rgb(image):
        sigma = 1
        return feature.canny(image, sigma=sigma, low_threshold=t/sigma/2, high_threshold=t/sigma)

    edges = color.rgb2hsv(filter_rgb(img))
    edges = edges[..., 2]
    return edges

images = io.ImageCollection('*.bmp', conserve_memory=True)

for i, im in enumerate(images):
    es = edges(im, t=220)
    output = im.copy()
    circles = cv2.HoughCircles((es*255).astype(np.uint8), cv2.cv.CV_HOUGH_GRADIENT, dp=1, minDist=50, param2=50, minRadius=0, maxRadius=0)

    if circles is not None:
        circles = np.round(circles[0, :]).astype("int")

        for (x, y, r) in circles:
            cv2.circle(output, (x, y), r, (0, 255, 0), 4)
            cv2.rectangle(output, (x - 5, y - 5), (x + 5, y + 5), (0, 128, 255), -1)

    # now es is edges
    # and output is image with marked circles

几个示例图像,检测到边缘和圆圈:

我正在使用 Canny 边缘检测和霍夫变换,这是检测圆的最常用方法。然而,使用相同的参数,它在一些照片上几乎找不到任何东西,而在其他照片上发现太多圆圈。

你能给我一些关于如何做得更好的指示和建议吗?

嗯,我会在精明的结果中做一些形态学操作,比如 作为关闭和打开操作: http://en.wikipedia.org/wiki/Mathematical_morphology

我也建议你看看分水岭方案。应用 直接进入图像梯度,然后在其上进行霍夫变换。 http://en.wikipedia.org/wiki/Watershed_%28image_processing%29

我最终在 reddit 上使用 dlib's object detector and it performed very well. The detector can be easily applied for detecting any kind of objects. For some related discussion see the question topic