9

Vorrei estrarre i contorni di un'immagine, espressa come una sequenza di coordinate punto.Estrarre contorni a linea singola dai bordi Canny

Con Canny Sono in grado di produrre un'immagine binaria che contiene solo i bordi dell'immagine. Quindi, sto cercando di utilizzare findContours per estrarre i contorni. I risultati non sono OK, però.

Per ciascun bordo ho spesso ottenuto 2 linee, come se fosse considerata un'area molto sottile. Mi piacerebbe semplificare i miei contorni in modo da poterli disegnare come linee singole. O forse estrarli con una funzione diversa che produce direttamente il risultato corretto sarebbe anche meglio.

Ho dato un'occhiata alla documentazione di OpenCV ma non sono riuscito a trovare nulla di utile, ma suppongo di non essere il primo con un problema simile. C'è qualche funzione o metodo che potrei usare?

ecco il codice Python che ho scritto finora:

def main(): 
    img = cv2.imread("lena-mono.png", 0) 

    if img is None: 
     raise Exception("Error while loading the image") 

    canny_img = cv2.Canny(img, 80, 150) 

    contours, hierarchy = cv2.findContours(canny_img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE) 
    contours_img = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR) 

    scale = 10 
    contours_img = cv2.resize(contours_img, (0, 0), fx=scale, fy=scale) 

    for cnt in contours: 
     color = np.random.randint(0, 255, (3)).tolist() 
     cv2.drawContours(contours_img,[cnt*scale], 0, color, 1) 

    cv2.imwrite("canny.png", canny_img) 
    cv2.imwrite("contours.png", contours_img) 

Il fattore di scala è usato per evidenziare le doppie linee dei contorni. Ecco i link alle immagini:

  • Lena in scala di grigi
  • Edges estratti con Canny
  • Contours: zoom 10x, dove si possono vedere le sbagliate risultati prodotti da findContours

Qualsiasi il suggerimento sarà molto apprezzato

+1

si dovrebbe usare HoughLines http://docs.opencv.org/modules/imgproc/doc/feature_detection.html#houghlines – Khashayar

+0

sfocare l'immagine per ridurre i rumori – baci

+0

Non penso che sia una questione di rumore in e immagine. Se osservi i bordi estratti con Canny, sono OK. Con HoughLines non sarei in grado di gestire linee curve nell'immagine, non è vero? – Muffo

risposta

6

Se ho capito bene, la tua domanda non ha nulla a che fare con la ricerca di linee in un parametrico (trasformazione Hough).

Piuttosto, è un problema con il metodo findContours che restituisce più contorni per una singola linea.

Questo è perché Canny è un bordo rivelatore - che significa che è in sintonia filtro al gradiente di intensità dell'immagine che si verifica su entrambi lati di una linea.

Quindi la tua domanda è più simile a: “come posso convertire funzionalità all'avanguardia di basso livello per singola linea?”, O forse: “Come posso navigare nella gerarchia contorni di rilevare singole linee"

Questo è un tema abbastanza comune - ed ecco un post precedente che ha proposto una soluzione:

OpenCV converting Canny edges to contours

Problemi correlati