2016-05-21 5 views
0

Ich habe grundsätzlich mehrere Binärbilder, die jeweils eine verbundene Komponente enthalten. Diese verbundenen Komponenten wurden aus einem Bild abgerufen, was bedeutet, dass, wenn alle verbundenen Komponenten in eine einzelne Bilddatei gezeichnet würden, es keine leeren Räume und keine überlappenden verbundenen Komponenten gäbe. Ich bin auf der Suche nach einem schnellen Weg, um die Kantenpixel aus den verbundenen Komponenten zu extrahieren. Die verbundenen Komponenten werden derzeit in einem einzigen Bild gespeichert, wobei eine Nummer i an der Position (x, y) der i-ten verbundenen Komponente entspricht. Da es viele verbundene Komponenten gibt, deren maximale Anzahl im Bereich von 400-2000 liegt, suche ich nach einem schnellen Weg, um die Kantenpixel jeder Komponente zu erhalten. Hier ist ein Bild zu zeigen, was ich von dem Algorithmus erwarten: ExamplePython: Holen Kanten aus mehreren (> 400) Binärbilder schnell

Ich bin mir bewusst, dass es ein paar Kantenerkennungsalgorithmen sind, aber sie beschäftigen sich mit Graustufenbildern und wird nicht gut für kleine Objekte in großen Bildern sein bei einer großen Anzahl von Bildern. Irgendwelche Vorschläge?

+0

Wenn nur jedes Bild enthält 1 kleines Objekt Ernte Ihre Bilder auf die Größe des Objekts oder ROIs verwenden. Ihr Ansatz zu Ihrer Aufgabe scheint nicht sehr aufwendig ... – Piglet

+0

k-means Clustering -> Kantenerkennung –

Antwort

0

Dies kann mit morphologischen Operationen und Minimum/Maximum-Filter spezifischer gelöst werden. Die Geschwindigkeit sollte akzeptabel sein, da das gesamte Bild unabhängig von der Anzahl der Komponenten nur zweimal verarbeitet werden muss.

Der größte Teil des folgenden Codes dient nur zum Generieren eines Beispielbildes. Die entsprechenden Zeilen für den Erhalt der Grenzen sind unten angegeben:

# imports 
import numpy as np 
import scipy as sp 
import scipy.ndimage 

# size of test image 
L=50  
# number of components 
I=20  
# auxiliary array 
array=np.zeros((I,L,L)) 

# for each component 
for i in range(I): 

    # draw random coordinates 
    x,y=sp.random.randint(0,L,size=2) 

    # set coordinate in auxiliary array to index of i-th component 
    array[i,x,y]=i 

    # create 'box' around coordinate 
    array[i]=sp.ndimage.maximum_filter(array[i],size=20) 

# create actual test image from auxiliary array 
image=np.nanmax(array,axis=0) 

# RELEVANT LINES: check if pixel belongs to border 
imax=(sp.ndimage.maximum_filter(image,size=3)!=image) 
imin=(sp.ndimage.minimum_filter(image,size=3)!=image) 
icomb=np.logical_or(imax,imin) 

# keep only pixels of original image at borders 
edges=np.where(icomb,image,np.nan) 

Verwandte Themen