2017-11-27 4 views
1

Ich arbeite an einem Segmentierungsproblem, bei dem ein Bild jedem RGB-Wert eine Klassenbezeichnung zugeordnet wird. Das Problem, das ich habe, besteht darin, RGB-Werte von einem Bild (numpy array) zu einem entsprechenden Klassenetikettenbild effizient abzubilden.Zuordnung von RGB-Werten in einem Bild zu einer entsprechenden ID mit einem Wörterbuch

Lassen Sie sich das folgende vereinfachte Beispiel liefern:

color2IdMap 
{(100,0,100):0, (0,200,0):2} 

labelOld 
array([[[100,0,100], 
     [0,200,0]], 
     [[100,0,100], 
     [0,200,0]]], dtype=uint8) 

(in einem realen Beispiel die colorIdMap etwa 20 Einträge hat und labelOld wird eine Anordnung von Form sein: (1024,512,3))

Jetzt möchte ich, dass das Ergebnis das folgende abgebildete Array ist. mit Form: (1024.512)

labelNew 
array([[ 0, 2], 
     [ 0, 2]]) 

habe ich versucht, diese Comprehensions mit Schleifen und Liste zu tun, aber beide Methoden sind ziemlich langsam (etwa ~ 10 Sekunden pro Bild, was für 250K Bilder eine große Zahl ist). Und ich frage mich, ob es einen schnelleren Weg gibt, es zu tun.


Versuchte Methode 1:

labelNew = np.empty((1052,1914), dtype=np.uint8) 
for i in range(1052): 
    for j in range(1914): 
     labelNew[i, j] = color2IdMap[tuple(labelOld[i, j])] 

Versuchte Methode 2:

labelNew = [[color2IdMap[tuple(x)] for x in y] for y in labelOld] 

So ist meine Frage, ob es eine schnellere und effizientere Art und Weise ist das zu tun?

+0

Sollte das nicht sein '[[ 0, 2], [0,2]] '? – Divakar

+0

ah ja! Tippfehler korrigiert! – afroze

Antwort

0

Hier ist ein Ansatz, der auf dimensionality-reduction -

# Get keys and values 
k = np.array(list(color2IdMap.keys())) 
v = np.array(list(color2IdMap.values())) 

# Setup scale array for dimensionality reduction 
s = 256**np.arange(3) 

# Reduce k to 1D 
k1D = k.dot(s) 

# Get sorted k1D and correspondingly re-arrange the values array 
sidx = k1D.argsort() 
k1Ds = k1D[sidx] 
vs = v[sidx] 

# Reduce image to 2D 
labelOld2D = np.tensordot(labelOld, s, axes=((-1),(-1))) 

# Get the positions of 1D sorted keys and get the correspinding values by 
# indexing into re-arranged values array 
out = vs[np.searchsorted(k1Ds, labelOld2D)] 

Alternativ könnten wir sidx als Sortierer Eingang arg für np.searchsorted verwenden, um die endgültige Ausgabe zu erhalten -

out = v[sidx[np.searchsorted(k1D, labelOld2D, sorter=sidx)]] 
Verwandte Themen