2012-04-08 17 views
2

Ich benutze Python mit Matplotlib zum Zeichnen.Matplotlib: Plot Unterschiede zwischen zwei Bildern

Ich habe zwei Matrizen (Bilder in Graustufen) wie folgt aus:

x = np.array([[0,1,0], [1,0,1]]) 
y = np.array([[0,0.4,0], [1,0,1]]) 

ich ein neues Bild z darstellen möchten, die die Unterschiede zeigen (wie wir grüne Punkte sagen) zwischen x und y und verlassen die anderen Punkte in Graustufen. Wenn also im vorherigen Beispiel 1 schwarz und 0 weiß ist, sollte z ein identisches Bild mit einem grünen Punkt entsprechend der Differenz zwischen x und y (in diesem Fall 0,4) sein.

Der Zweck davon ist, die Ausführung des K-Means-Algorithmus in den handgeschriebenen Datenbildern zu animieren, um zu sehen, wie der Algorithmus arbeitet.

Ich hoffe, das ist klar, Entschuldigung für mein Englisch.

+2

+1 und ein Stern für diese Frage. Beachten Sie, dass es nützlich wäre, wenn Sie in den 7 Fragen, die Sie zuvor gestellt haben, so viele Antworten wie möglich angenommen haben. Dies würde den Menschen mehr Ansporn geben, sich die Zeit zu nehmen, diese Frage ebenso wie die folgenden zu beantworten. – EOL

Antwort

4

Die einfachste Lösung besteht darin, zuerst die RGBA-Farben Ihrer Eingabedaten zu berechnen, sie so zu bearbeiten, dass die Werte Ihrer Sonderfarbe (grün) abweichen, und dann das modifizierte RGBA-Array mit einem einfachen imshow() zu zeichnen. Hier ist, wie dies getan werden kann:

>>> rgba_values = cm.gray(y) # All RGBA values for your input value, with levels of gray 
>>> rgba_values[x != y] = [0, 1, 0, 1] # Set the points where x and y differ to green (RBG = 0, 1, 0) 
>>> imshow(rgba_values, interpolation='nearest') 

Die Datenpunkte, die x und y sind jetzt in grün zwischen Arrays unterscheiden: image with the common data in gray and the differences in green

Wenn Sie Ihre grünen Punkte auf einem Bild zu überlagern vorher angezeigt, Sie können auf 0 etwas ähnliches und stellen Sie den alpha-Kanal tun, wo Sie wollen nicht das Originalbild ändern:

>>> y_gray = cm.gray(y) # RGBA image with gray levels 
>>> imshow(y_gray, interpolation='nearest') # Image of one of the arrays 
>>> diff_points = numpy.empty_like(y_gray) # Preparation of an overlay with marked points only 
>>> diff_points[x == y, 3] = 0 # Common points not overwritten: alpha layer set to 0 
>>> diff_points[x != y] = [0, 1, 0, 1] # Green for points that differ 
>>> imshow(diff_points, interpolation='nearest') 
+0

Vielen Dank. Es klappt. Nur eine Sache noch, wie kann ich die Transparenz der grünen Punkte festlegen? – blueSurfer

+0

Ok, ich mache es Ich füge einfach die folgende Zeile hinzu: diff_points [x! = Y, 3] = 0,8 Nochmals vielen Dank – blueSurfer

+0

@ user950625: Vielen Dank für die Annahme dieser Antwort. Einstellen der Transparenz der grünen Punkte, wenn besser mit 'diff_points [x! = Y] = [0, 1, 0, 0.8]': die 4 Werte sind die RGB- und Alpha (Transparenz) -Werte der Punkte, die sich zwischen Ihren unterscheiden 'x' und' y' Arrays. – EOL

0

Eine andere Möglichkeit ist es, die colorma zu verändern p, um bestimmte Werte zu zeigen, anders,

import matplotlib.cm, matplotlib.pyplot as plt, numpy as np, copy 
x = np.array([[0,1,0], [1,0,1]]) 
y = np.array([[0,0.4,0], [1,0,1]]) 
y_mod = y.copy() 
y_mod[x != y] = np.nan # filling the differing pixels with NaNs  
xcm = copy.copy(matplotlib.cm.gray) # copying the gray colormap 
xcm.set_bad(color='green', alpha=0.5) # setting the color for "bad" pixels" 
plt.imshow(y_mod, cmap=xcm, interpolation='none') 

Ein Vorteil dieses Ansatzes ist, dass man dann später diese colormap wiederverwenden können.