2013-11-01 70 views
5

我试图在图中检测到“洞”,也就是说,它们不是很圈,它们大小各不相同。图像始终是黑色和白色。试图让我的头解决这个问题,我从Python文档中拿了一个例子:Python OpenCV - 检测微小的“洞”(圈)

import cv2 
from cv2 import * 
import numpy as np 

img = cv2.imread('hole_test.jpg',0) 
img = cv2.medianBlur(img,5) 
cimg = cv2.cvtColor(img,cv2.COLOR_GRAY2BGR) 

circles = cv2.HoughCircles(img,cv2.cv.CV_HOUGH_GRADIENT,1,5,param1=200,param2=100,minRadius=0,maxRadius=0) 

circles = np.uint16(np.around(circles)) 
for i in circles[0,:]: 
    # pinpoint hole 
    cv2.circle(cimg,(i[0],i[1]),2,(0,0,255),3)  
cv2.imshow('holes detected',cimg) 
cv2.waitKey(0) 
cv2.destroyAllWindows() 

检测到的漏洞很少和很远。我能做些什么来提高此示例的准确性,或者这不是实现此目的的最佳方法吗?

这是一个示例图像,只是为了显示我想找到的各种大小/形状的“洞”。

example image

例2的要求

Example 2 as requested:

+1

模式识别可以在这一潜在的工作,你试过吗? –

+0

不,我还没有找到一个这样的例子。这里的示例图像仅仅是为了说明我试图在图像中找到的“孔”的大小和形状。 –

+1

您的任何图像是否包含您想要避免检测的孔洞? – YXD

回答

4

enter image description here

代码

import cv2 
import numpy as np 

im = cv2.imread('holes2.jpg') 

gray=cv2.cvtColor(im,cv2.COLOR_BGR2GRAY) 
gray=cv2.threshold(gray,20,255,cv2.THRESH_BINARY)[1] 
cv2.imshow('gray',gray) 

contours,hierarchy = cv2.findContours(gray,cv2.RETR_LIST ,cv2.CHAIN_APPROX_SIMPLE ) 

for cnt in contours: 
    area = cv2.contourArea(cnt) 
    if area<400: 
     cv2.drawContours(im,[cnt],0,(255,0,0),2) 

cv2.imshow('im',im) 
cv2.waitKey() 
+0

完美,我可以继续完成任务的其余部分。感谢你的这个例子和你所做的一切努力。 –