2014-05-07 11 views
10

Uno dei miei amici stava lavorando al seguente progetto:Ricerca di pozzi in un'immagine

Di seguito è l'immagine microscopica (SEM) della superficie di acciaio inossidabile.

enter image description here

Ma si può vedere, è corroso un po '(dopo una lunga esposizione al ambiente marino) e alcuni pozzi si formano sulla superficie. Alcuni dei box sono segnati in cerchio rosso.

Ha bisogno di trovare il numero di box nell'immagine e lo stava contando manualmente (immagina, ci sono quasi 150 immagini). Quindi ho pensato di automatizzare questo processo con qualsiasi strumento di elaborazione delle immagini.

Domanda:

Come posso trovare il numero di pozzi in questa immagine?


Quello che ho cercato:

Come primo passo, ho migliorato il contrasto un po 'dalla manovra di chiusura.

import numpy as np 
import cv2 
from matplotlib import pyplot as plt 

img = cv2.imread('6.jpg') 
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(11,11)) 

close = cv2.morphologyEx(gray, cv2.MORPH_CLOSE, kernel) 

close2 = cv2.add(close,1) 
div = (np.float32(gray)+1)/(close2) 
div2 = cv2.normalize(div,None, 0,255, cv2.NORM_MINMAX) 
div3 = np.uint8(div2) 

Risultato:

enter image description here

Poi ho applicato una soglia per 127 e trovare contorni in esso. Successivamente questi contorni vengono filtrati in base alla loro area (non ci sono informazioni specifiche sull'area, ho preso un intervallo di 1-10 come valore empirico).

ret, thresh = cv2.threshold(div3, 127,255, cv2.THRESH_BINARY_INV) 
temp, contours, hierarchy = cv2.findContours(thresh, cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE) 

res = np.zeros(gray.shape,np.uint8) 

for cnt in contours: 
    if 1.0 < cv2.contourArea(cnt) < 10.0: 
     res = cv2.drawContours(res, [cnt], 0, 255, -1) 

plt.subplot(121); plt.imshow(img, 'gray'); plt.subplot(122); plt.imshow(res,'gray'); plt.show() 

Ma è finito in un sacco di rumore extra. Vedere il risultato qui sotto:

enter image description here


Informazioni aggiuntive:

Alcune immagini di prova:

enter image description here enter image description here

+1

Un altro modo per eseguire la fase di pre-elaborazione sarebbe questo: http://scikit-image.org/docs/dev/auto_examples/plot_holes_and_peaks.html –

risposta

6

tuo caso mi ricorda di un documento (Human Detection Using a Mobile Platform and Novel Features Derived From a Visual Saliency Mechanism) che calcola Saliency su un'immagine basata sulla nozione di cellule ganglionari centrali, ovvero un metodo che rileva i pixel luminosi circondati da aree scure (o l'opposto chiamato celle decentrate).

Ganglion cells

al ravvicinamento di tali celle è possibile utilizzare aree rettangolari. Con l'uso di immagini integrali, è possibile accelerare la procedura. Controlla la carta per i dettagli.

Un'ultima idea sarebbe stata la convoluzione di un filtro composito. Trova un modello molto vicino a ogni buca e associa il modello all'immagine (o usa più filtri per la variazione di scala/forma).

+0

"pixel luminosi circondati da aree scure" è questo il punto! – Yvon