2010-09-20 9 views
13

ich schon einen Blick auf diese Frage getroffen haben: SO question und scheinen zum Ersetzen einer einzigen Farbe, einschließlich der Alpha-Werte eine sehr ähnliche Technik umgesetzt haben:Python: PIL eine einzige RGBA Farbe ersetzen

c = Image.open(f) 
c = c.convert("RGBA") 
w, h = c.size 
cnt = 0 
for px in c.getdata(): 
    c.putpixel((int(cnt % w), int(cnt/w)), (255, 0, 0, px[3]))                          cnt += 1 

jedoch Das ist sehr langsam. Ich habe dieses Rezept auf den Interwebs gefunden, aber ich hatte bisher noch keinen Erfolg damit: recipe

Was ich versuche zu tun, ist verschiedene PNG-Bilder, die aus einer einzigen Farbe, weiß, zu nehmen. Jedes Pixel ist 100% weiß mit verschiedenen Alpha-Werten, einschließlich Alpha = 0. Ich möchte das Bild im Grunde mit einer neuen festgelegten Farbe färben, zum Beispiel # ff0000 < 00-ff>. SO mein Start und resultierende Bilder würde so aussehen, wo die linke Seite ist mein Startbild und das Recht ist mein Ende Bild (HINWEIS: Hintergrund wurde zu einem hellgrauen geändert, so dass Sie es sehen können, da es tatsächlich transparent ist und Sie würden nicht t in der Lage sein, die Punkte auf der linken Seite zu sehen.)

alt text

einen besseren Weg, dies zu tun?

Antwort

32

Wenn Sie eine Nummer haben, können Sie viel schneller auf PIL-Bildern arbeiten.

ZB:

import Image 
import numpy as np 

im = Image.open('test.png') 
im = im.convert('RGBA') 

data = np.array(im) # "data" is a height x width x 4 numpy array 
red, green, blue, alpha = data.T # Temporarily unpack the bands for readability 

# Replace white with red... (leaves alpha values alone...) 
white_areas = (red == 255) & (blue == 255) & (green == 255) 
data[..., :-1][white_areas.T] = (255, 0, 0) # Transpose back needed 

im2 = Image.fromarray(data) 
im2.show() 

Edit: Es ist ein langsamer Montag, also dachte ich, dass ich ein paar Beispiele hinzufügen würde:

Nur um zu zeigen, dass es die Alpha-Werte allein verlässt, ist hier die Ergebnisse für eine Version des Bildes beispielsweise mit einem radialen Gradienten auf den Alphakanal angewandt:

Original: alt text

Ergebnis: alt text

+1

Awesome! Genial! Genial! +1 und markiert als "Akzeptiert". Große Zeitersparnis und Ergebnisse sind perfekt. – sberry

+0

@sberry - Froh, zu helfen! –

+0

sollte nicht sein, Rot Grün Blau? white_areas = – Sekai

2

Das Pythonware PIL Online Buch Kapitel für die Image module schreibt vor, dass putpixel() langsam ist und schlägt vor, dass es durch Inlining beschleunigt werden kann. Oder, abhängig von der PIL-Version, stattdessen load() verwenden.

2

Versuchen Sie dies, in diesem Beispiel setzen wir die Farbe auf schwarz, wenn die Farbe nicht weiß ist.

#!/usr/bin/python 
from PIL import Image 
import sys 

img = Image.open(sys.argv[1]) 
img = img.convert("RGBA") 

pixdata = img.load() 

# Clean the background noise, if color != white, then set to black. 

for y in xrange(img.size[1]): 
    for x in xrange(img.size[0]): 
     if pixdata[x, y] == (255, 255, 255, 255): 
      pixdata[x, y] = (0, 0, 0, 255) 

Sie Farbwähler in Gimp verwenden können, um die Farbe zu absorbieren und sehen, das ist RGBA-Farb

Verwandte Themen