2013-11-01 17 views
5

Sto provando a rilevare "buchi" in un disegno, vale a dire non sono abbastanza cerchi, sono di dimensioni variabili. Le immagini sono sempre in bianco e nero. Sto solo cercando di ottenere la mia testa intorno a questo problema, ho preso un esempio dalla documentazione Python:Python OpenCV - Rilevazione di piccoli "buchi" (cerchi)

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() 

I fori rilevati sono pochi e lontani tra loro. C'è qualcosa che posso fare per migliorare la precisione di questo esempio o non è questo il modo migliore per ottenere questo?

Questa è un'immagine di esempio, semplicemente per mostrare le varie dimensioni/forma dei "fori" che sto cercando di trovare.

example image

Esempio 2 come richiesto

Example 2 as requested:

+1

Pattern recognition potrebbe potenzialmente lavorare su questo, hai provato? –

+0

No, devo ancora trovare un esempio di questo. L'immagine di esempio qui è semplicemente per illustrare le dimensioni e le forme dei "buchi" che sto cercando di trovare all'interno delle immagini. –

+1

Alcune delle tue immagini contengono cose che non sono buchi che vuoi evitare di rilevare? – YXD

risposta

4

enter image description here

codice

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

Perfetto, posso andare avanti con il resto del compito. Grazie per questo esempio e tutti i tuoi sforzi. –