Frage

Ich versuche mit Numpy und Pil zwei Bilder zusammen hinzuzufügen. Die Art, wie ich das tun würde Matlab wäre so etwas wie:

>> M1 = imread('_1.jpg');
>> M2 = imread('_2.jpg');
>> resM = M1 + M2;
>> imwrite(resM, 'res.jpg');

Ich bekomme so etwas:

ALT -Text http://www.deadlink.cc/matlab.jpg

Mit einem Kompositionsprogramm und dem Hinzufügen der Bilder scheint das Matlab -Ergebnis richtig zu sein.

In Python versuche ich das Gleiche wie folgt zu tun:

from PIL import Image
from numpy import *

im1 = Image.open('/Users/rem7/Desktop/_1.jpg')
im2 = Image.open('/Users/rem7/Desktop/_2.jpg')

im1arr = asarray(im1)
im2arr = asarray(im2)

addition = im1arr + im2arr

resultImage = Image.fromarray(addition)
resultImage.save('/Users/rem7/Desktop/a.jpg')

Und ich bekomme so etwas:

ALT Text http://www.deadlink.cc/python.jpg

Warum bekomme ich all diese funky Farben? Ich habe auch versucht zu verwenden ImageMath.eval("a+b", a=im1, b=im2), aber ich bekomme einen Fehler über RGB, das nicht unterstützt wird.

Ich habe auch gesehen, dass es eine gibt Image.blend() Aber das erfordert ein Alpha.

Was ist der beste Weg, um das zu erreichen, wonach ich suche?

Quellbilder (Bilder wurden entfernt):

ALT -Text http://www.deadlink.cc/_1.jpg ALT -Text http://www.deadlink.cc/_2.jpg

Humm, OK, ich habe die Quellbilder mit dem Bildsymbol hinzufügen hinzugefügt und sie werden angezeigt, wenn ich den Beitrag bearbeite, aber aus irgendeinem Grund werden die Bilder nicht im Beitrag angezeigt.

(Die Bilder wurden entfernt) 2013 05 09

War es hilfreich?

Lösung

Wie alle bereits vorgeschlagen haben, sind die seltsamen Farben, die Sie beobachten, Überlauf. Und wie Sie in der betonen Kommentar von Schnaaders Antwort Sie immer noch überlaufen Wenn Sie Ihre Bilder wie diese hinzufügen:

addition=(im1arr+im2arr)/2

Der Grund für diesen Überlauf ist, dass Ihre Numpy -Arrays (IM1arr IM2arr) sind von der uint8 Typ (dh 8-Bit). Dies bedeutet, dass jedes Element des Arrays nur die Werte bis zu 255 halten kann. Wenn Ihre Summe 255 überschreitet, werden etwa 0 zurückgefahren:

>>>array([255,10,100],dtype='uint8') +  array([1,10,160],dtype='uint8')
array([ 0, 20,  4], dtype=uint8)

Um Überlauf zu vermeiden, sollten Ihre Arrays in der Lage sein, Werte über 255 zu enthalten konvertieren sie in Schwimmkörper Führen Sie beispielsweise den Mischvorgang durch und durch Konvertieren Sie das Ergebnis zurück in UINT8:

im1arrF = im1arr.astype('float')
im2arrF = im2arr.astype('float')
additionF = (im1arrF+im2arrF)/2
addition = additionF.astype('uint8')

Du sollte nicht mach das:

addition = im1arr/2 + im2arr/2

Wenn Sie Informationen verlieren, drücken Sie die Dynamik des Bildes (Sie machen die Bilder effektiv 7-Bit), bevor Sie die Mischinformationen ausführen.

MATLAB Note: Der Grund, warum Sie dieses Problem in MATLAB nicht sehen, liegt wahrscheinlich daran, dass Matlab den Überlauf implizit in einer seiner Funktionen kümmert.

Andere Tipps

Die Verwendung von PILs Blend () mit einem Alpha -Wert von 0,5 wäre äquivalent zu (IM1arr + IM2arr)/2. Mischung erfordert nicht, dass die Bilder Alpha -Ebenen haben.

Versuche dies:

from PIL import Image
im1 = Image.open('/Users/rem7/Desktop/_1.jpg')
im2 = Image.open('/Users/rem7/Desktop/_2.jpg')
Image.blend(im1,im2,0.5).save('/Users/rem7/Desktop/a.jpg')

Es scheint, dass der Code, den Sie gepostet haben, nur die Werte zusammenfasst und Werte, die größer als 256 sind. Sie wollen so etwas wie "(a + b) / 2" oder "min (a + b, 256)". Letzteres scheint die Art und Weise zu sein, wie es Ihr Matlab -Beispiel tut.

Numpy Array -Werte klemmen:

>>> c = a + b
>>> c[c > 256] = 256

Ihre Beispielbilder zeigen mich nicht, also werde ich ein bisschen raten.

Ich kann mich nicht genau erinnern, wie der Numpy -to -PIL -Umbau funktioniert, aber es gibt zwei wahrscheinliche Fälle. Ich bin zu 95% sicher, dass es 1 ist, aber ich gebe 2, nur für den Fall, dass ich falsch liege. 1) 1 IM1arr ist ein MXN -Array von Ganzzahlen (ARGB) und wenn Sie IM1arr und IM2arr zusammen hinzufügen, überfließen Sie von einem Kanal in den nächsten, wenn die Komponenten B1+B2> 255. Ich vermute, dass Matlab ihre Bilder als mxNX3 -Arrays repräsentiert, sodass jeder Farbkanal getrennt ist. Sie können dies lösen, indem Sie die PIL -Bildkanäle teilen und dann Numpy -Arrays machen

2) 1 IM1arr ist ein MXNX3 -Array von Bytes, und wenn Sie IM1arr und IM2arr zusammen hinzufügen, wickeln Sie die Komponente um.

Sie müssen die Reichweite auch vor der Anzeige auf zwischen 0 und 255 neu skalieren. Ihre Auswahl wird durch 2 dividiert, skaliert um 255/array.max () oder einen Clip durchführen. Ich weiß nicht, was Matlab tut

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top