使用OpenCV编写鲁棒(颜色和大小不变)的圆形检测(基于Hough变换或其他特征)

9 浏览
0 Comments

使用OpenCV编写鲁棒(颜色和大小不变)的圆形检测(基于Hough变换或其他特征)

我编写了以下非常简单的Python代码来在图像中找到圆形:

import cv
import numpy as np
WAITKEY_DELAY_MS = 10
STOP_KEY = 'q'
cv.NamedWindow("image - press 'q' to quit", cv.CV_WINDOW_AUTOSIZE);
cv.NamedWindow("post-process", cv.CV_WINDOW_AUTOSIZE);
key_pressed = False
while key_pressed != STOP_KEY:
    # 获取图像
    orig = cv.LoadImage('circles3.jpg')
    # 创建临时图像
    grey_scale = cv.CreateImage(cv.GetSize(orig), 8, 1)
    processed = cv.CreateImage(cv.GetSize(orig), 8, 1)
    cv.Smooth(orig, orig, cv.CV_GAUSSIAN, 3, 3)
    cv.CvtColor(orig, grey_scale, cv.CV_RGB2GRAY)
    # 对灰度图像进行一些处理
    cv.Erode(grey_scale, processed, None, 10)
    cv.Dilate(processed, processed, None, 10)
    cv.Canny(processed, processed, 5, 70, 3)
    cv.Smooth(processed, processed, cv.CV_GAUSSIAN, 15, 15)
    storage = cv.CreateMat(orig.width, 1, cv.CV_32FC3)
    # 这些参数需要针对每个图像进行调整
    HIGH = 50
    LOW = 140
    try: 
        # 提取圆形
        cv.HoughCircles(processed, storage, cv.CV_HOUGH_GRADIENT, 2, 32.0, HIGH, LOW)
        for i in range(0, len(np.asarray(storage))):
            print "circle #%d" %i
            Radius = int(np.asarray(storage)[i][0][2])
            x = int(np.asarray(storage)[i][0][0])
            y = int(np.asarray(storage)[i][0][1])
            center = (x, y)
            # 在中心点上绘制绿点和红圆
            cv.Circle(orig, center, 1, cv.CV_RGB(0, 255, 0), -1, 8, 0)
            cv.Circle(orig, center, Radius, cv.CV_RGB(255, 0, 0), 3, 8, 0)
            cv.Circle(processed, center, 1, cv.CV_RGB(0, 255, 0), -1, 8, 0)
            cv.Circle(processed, center, Radius, cv.CV_RGB(255, 0, 0), 3, 8, 0)
    except:
        print "nothing found"
        pass
    # 显示图像
    cv.ShowImage("image - press 'q' to quit", orig)
    cv.ShowImage("post-process", processed)
    cv_key = cv.WaitKey(WAITKEY_DELAY_MS)
    key_pressed = chr(cv_key & 255)

从下面的两个例子可以看出,“圆形检测质量”变化很大:

CASE1:

input1

detection1

post-processed1

CASE2:

input2

detection2

post-processed2

Case1和Case2基本上是相同的图像,但算法仍然检测到不同的圆形。如果我给算法一个大小不同的圆形的图像,圆形检测甚至可能完全失败。这主要是由于需要针对每个新图片进行个别调整的HIGHLOW参数造成的。

因此我的问题是:有哪些使这个算法更健壮的各种可能性?它应该是大小和颜色不变的,以便检测到不同颜色和不同大小的圆。也许使用Hough变换不是最好的方法?有更好的方法吗?

0