使用OpenCV编写鲁棒(颜色和大小不变)的圆形检测(基于Hough变换或其他特征)
使用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:
CASE2:
Case1和Case2基本上是相同的图像,但算法仍然检测到不同的圆形。如果我给算法一个大小不同的圆形的图像,圆形检测甚至可能完全失败。这主要是由于需要针对每个新图片进行个别调整的HIGH
和LOW
参数造成的。
因此我的问题是:有哪些使这个算法更健壮的各种可能性?它应该是大小和颜色不变的,以便检测到不同颜色和不同大小的圆。也许使用Hough变换不是最好的方法?有更好的方法吗?