2016-04-19 18 views
13

Sto cercando di estrarre i vasi sanguigni da un'immagine, e per farlo, sto prima equalizzazione dell'immagine, applicando CLAHE istogramma per ottenere il seguente risultato:problemi di elaborazione delle immagini con i vasi sanguigni

 clahe = cv2.createCLAHE(clipLimit=100.0, tileGridSize=(100,100)) 
     self.cl1 = clahe.apply(self.result_array) 
     self.cl1 = 255 - self.cl1 

enter image description here

E poi sto usando soglia OTSU per estrarre i vasi sanguigni, ma non riuscendo a farlo bene:

self.ret, self.thresh = cv2.threshold(self.cl1, 0,255,cv2.THRESH_BINARY + cv2.THRESH_OTSU) 
     kernel = np.ones((1,1),np.float32)/1 
     self.thresh = cv2.erode(self.thresh, kernel, iterations=3) 
     self.thresh = cv2.dilate(self.thresh, kernel, iterations=3) 

Ecco il risultato:

enter image description here

Ovviamente c'è un sacco di rumore. Ho provato a utilizzare la sfocatura di Median, ma raggruppa solo il rumore e lo trasforma in un blob, in alcuni punti. Come faccio a rimuovere il rumore per ottenere i vasi sanguigni?

Questa è l'immagine originale da cui sto cercando di estrarre i vasi sanguigni:

enter image description here

+0

Si prega di allegare un'immagine originale e l'uscita prevista. – ZdaR

+0

Non ho l'output desiderato, mi dispiace. Ho allegato l'originale. –

+0

Proverai a impostare tileGridSize = (8,8) su qualcosa di più simile (20,20)? Credo che euqlizing sia un po 'troppo aggressivo. Non risolverebbe completamente il problema, ma potrebbe portare a risultati migliori. – Art

risposta

11

ottenere risultati veramente buoni è un problema difficile (probabilmente dovrete per modellare in qualche modo la struttura dei vasi sanguigni e del rumore) ma probabilmente si può ancora fare meglio del filtraggio.

Una tecnica per affrontare questo tipo di problemi, ispirato al Algoritmo di Canny, utilizza due soglie - [hi,low] e classificare un pixel p con risposta r come appartenenti ad un vaso sanguigno V se r > hi || (r > lo & & uno dei vicini p è in V).

Inoltre, quando si tratta di filtrare, sia il filtro bilaterale che il filtraggio del mean shift sono utili per le immagini disturbate.

kernel3 = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(3,3)) 
kernel5 = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(5,5)) 
kernel7 = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(7,7)) 
t_lo = 136 
t_hi = 224 

blured = cv2.pyrMeanShiftFiltering(img, 3, 9) 
#blured = cv2.bilateralFilter(img, 9, 32, 72) 

clahe = cv2.createCLAHE(clipLimit=128.0, tileGridSize=(64, 64)) 
cl1 = clahe.apply(blured) 
cl1 = 255 - cl1 

ret, thresh_hi = cv2.threshold(cl1, t_hi, 255, cv2.THRESH_TOZERO) 
ret, thresh_lo = cv2.threshold(cl1, t_lo, 255, cv2.THRESH_TOZERO) 

low threshold immagine Soglia bassa hi threshold soglia Hi immagine

Preparazioni e pulizia:

current = np.copy(thresh_hi) 
prev = np.copy(current) 
prev[:] = 0 
current = cv2.morphologyEx(current, cv2.MORPH_OPEN, kernel5) 
iter_num = 0 
max_iter = 1000 

Non è il modo più efficace per farlo ...ma facile da implementare:

while np.sum(current - prev) > 0 and iter_num < max_iter: 
    iter_num = iter_num+1 
    prev = np.copy(current) 
    current = cv2.dilate(current, kernel3) 
    current[np.where(thresh_lo == 0)] = 0 

initial mask maschera iniziale

rimuovere piccole macchie:

contours, hierarchy = cv2.findContours(current, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE) 
for contour in contours: 
    area = cv2.contourArea(contour) 
    if area < 256: 
     cv2.drawContours(current, [contour], 0, [0,0,0], -1) 

refined mask Dopo aver rimosso piccole macchie

pulitura morfologica:

opening = cv2.morphologyEx(current, cv2.MORPH_OPEN, kernel7) 
cl1[np.where(opening == 0)] = 0 

result Risultato

Questo non è affatto ottimale, ma penso che dovrebbe fornire abbastanza strumenti per iniziare.

6

ne dite: passa-alto (immagine meno gaussiana liscia con sigma 12), poi soglia (126) e quindi la soppressione di oggetti piccoli (oggetti che sono più piccoli di 300 pixel vengono rimossi)?

(ho lavorato con l'ultima immagine)

enter image description here

enter image description here

enter image description here

Problemi correlati