2013-01-17 11 views
5

Sto tentando di riempire buchi in un'immagine binaria. L'immagine è piuttosto grande, quindi l'ho suddivisa in blocchi per l'elaborazione.Scipy Binary Closing - Edge Pixel perde il valore

Quando utilizzo le funzioni scipy.ndimage.morphology.binary_fill_holes, riempie i fori più grandi che appartengono all'immagine. Così ho provato a utilizzare scipy.ndimage.morphology.binary_closing, che ha dato i risultati desiderati per riempire piccoli fori nell'immagine. Tuttavia, quando rimetto insieme i blocchi, per creare l'intera immagine, finisco con le linee di giuntura perché la funzione binary_closing rimuove qualsiasi valore dai pixel del bordo di ogni blocco.

C'è un modo per evitare questo effetto?

+0

Innanzitutto, sarebbe opportuno aggiungere un'immagine o un codice che spieghi un po 'di più il problema. In secondo luogo, non puoi evitare di introdurre artefatti tagliando in quel modo, dovrai riempire/espandere le tue fette in base alla dimensione dell'elemento di strutturazione in modo che il risultato sia corretto – YXD

+0

Il modo corretto per farlo è usando morfologico ricostruzione con l'immagine chiusa come un indicatore. – mmgp

risposta

1

Le operazioni che coinvolgono informazioni dai pixel adiacenti, ad esempio closing, presentano sempre problemi ai bordi. Nel tuo caso, questo è molto facile da aggirare: basta elaborare le immagini secondarie che sono leggermente più grandi della tua piastrellatura e conservare le parti buone quando si cuciono insieme.

+0

Quindi ho appena provato qualcosa di nuovo che penso suoni simile a quello che stai suggerendo. Ho preso il mio blocco e aggiunto una riga di zeri alla parte superiore e inferiore dell'array usando vstack. Ho fatto lo stesso a sinistra e a destra usando hstack. Quindi ho elaborato la chiusura binaria. Alla fine ho rimosso le righe e le colonne esterne per riportare l'immagine alla sua dimensione originale. Da quello che posso dire quando grafico le immagini fianco a fianco. Sembra corretto – Brian

+1

Potrebbe funzionare, ma penso che sia meno accurato rispetto all'utilizzo di dati reali dall'immagine.Quello che voglio dire è che se la tua immagine è dire, 1Mx1M, e vuoi farlo in 100 sotto-immagini 100Kx100K, processa invece le sotto-immagini che sono distanziate sulla piastrellatura di 100K ma sono 100.200 x 100.200 (cioè, una imbottitura da 100 pixel di reale e dati accurati dall'immagine tutto intorno), e quando si riassembla basta usare le parti del centro buono che sono 100.000 x 100.000. – tom10

4

Sì.

  1. Etichettare l'immagine usando ndimage.label (prima inverti l'immagine, fori = nero).
  2. Trova le fette oggetto foro con ndimage.find_objects
  3. filtrare l'elenco delle fette oggetto, sulla base di criteri dimensionali
  4. Inverti indietro la vostra immagine ed eseguire binary_fill_holes sulle fette i tuoi criteri.

Questo dovrebbe farlo, senza dover tagliare l'immagine. Per esempio: Immagine

ingresso:

enter image description here

Immagine in uscita (fori di dimensioni medie sono spariti):

enter image description here

Ecco il codice (disuguaglianza è impostato per rimuovere il mezzo dimensioni BLOB):

import scipy 
from scipy import ndimage 
import numpy as np 

im = scipy.misc.imread('cheese.png',flatten=1) 
invert_im = np.where(im == 0, 1, 0) 
label_im, num = ndimage.label(invert_im) 
holes = ndimage.find_objects(label_im) 
small_holes = [hole for hole in holes if 500 < im[hole].size < 1000] 
for hole in small_holes: 
    a,b,c,d = (max(hole[0].start-1,0), 
       min(hole[0].stop+1,im.shape[0]-1), 
       max(hole[1].start-1,0), 
       min(hole[1].stop+1,im.shape[1]-1)) 
    im[a:b,c:d] = scipy.ndimage.morphology.binary_fill_holes(im[a:b,c:d]).astype(int)*255 

Nota anche che ho dovuto aumentare la dimensione delle fette in modo che i fori avessero il bordo tutto intorno.

+0

Ho difficoltà a individuare qualsiasi differenza tra le due immagini che hai postato. – Jaime

+0

@Jaime - guarda più da vicino;) i fori di media dimensione sono assenti nella seconda immagine. – fraxel

+0

Il mio male! Stavo cercando dei buchi piccolissimi, quelli che sono andati sono molto più grandi di quanto mi aspettassi, – Jaime