PIL hat einige handlicher Bildmanipulationsmethoden haben, aber auch viele Nachteile, wenn man will Verarbeitung zu tun ernst Bild starten -
Die meisten Python lterature werden Sie empfehlen wechseln zu verwenden NumPy über Ihre Pixeldaten, die geben Sie volle Kontrolle - Andere Bildgebungsbibliotheken wie Leptonica, gegl und vips haben alle Python-Bindungen und eine Reihe von netten Funktion für Bildzusammensetzung/Segmentierung.
In diesem Fall ist die Sache, sich vorzustellen, wie man würde auf den gewünschten Ausgang in einem Bildbearbeitungsprogramm erhalten: Sie ein schwarzes haben würde (oder eine andere Farbe) Schatten über das Originalbild zu platzieren, und das zweite Bild über diese, Paste, aber eine Schwelle verwendet (dh ein pixel entweder gleich oder ist anders - alle Zwischenwerte auf „verschiedene gerundet werden sollte) der Differenzen als Maske auf das zweite Bild
.
Ich habe Ihre Funktion geändert, um eine solche Zusammensetzung zu erstellen -
from PIL import Image, ImageChops, ImageDraw
point_table = ([0] + ([255] * 255))
def new_gray(size, color):
img = Image.new('L',size)
dr = ImageDraw.Draw(img)
dr.rectangle((0,0) + size, color)
return img
def black_or_b(a, b, opacity=0.85):
diff = ImageChops.difference(a, b)
diff = diff.convert('L')
# Hack: there is no threshold in PILL,
# so we add the difference with itself to do
# a poor man's thresholding of the mask:
#(the values for equal pixels- 0 - don't add up)
thresholded_diff = diff
for repeat in range(3):
thresholded_diff = ImageChops.add(thresholded_diff, thresholded_diff)
h,w = size = diff.size
mask = new_gray(size, int(255 * (opacity)))
shade = new_gray(size, 0)
new = a.copy()
new.paste(shade, mask=mask)
# To have the original image show partially
# on the final result, simply put "diff" instead of thresholded_diff bellow
new.paste(b, mask=thresholded_diff)
return new
a = Image.open('a.png')
b = Image.open('b.png')
c = black_or_b(a, b)
c.save('c.png')
Dank JSbueno .this ist, was ich suchte for..cheers –
Na gut - die erwartete Gewohnheit hier ist, klicken Sie auf "akzeptieren" für die Antwort, anstatt zu senden Prost! :-) Danke trotzdem. – jsbueno
BTW, für jemanden, der dies nur für ein paar Bilder benötigt und nicht mit Python-Installationen umgehen möchte - ich habe hier interaktiv über GIMP geantwortet: http://graphicdesign.stackexchange.com/questions/27484/get -difference-zwischen-zwei-Bilder-als-transparent-Bild-in-Gimp/27486 # 27486 – jsbueno