it-swarm.com.de

PIL Bildfarben drehen (BGR -> RGB)

Ich habe ein Bild, in dem die Farben BGR sind. Wie kann ich mein PIL-Bild transformieren, um die B- und R-Elemente jedes Pixels effizient auszutauschen?

31
Claudiu

Angenommen, keine Alpha-Bande, ist es nicht so einfach?

b, g, r = im.split()
im = Image.merge("RGB", (r, g, b))

Bearbeiten:

Hmm ... Es scheint, dass PIL in dieser Hinsicht ein paar Bugs hat ... im.split() scheint mit den neuesten Versionen von PIL (1.1.7) nicht zu funktionieren. Es kann (?) Immer noch mit 1.1.6 funktionieren, aber ...

Alternativ, wenn Sie über eine verfügbare Zahl verfügen, können Sie dies verwenden: (Ich gehe hier wiederum von einem RGB-Bild aus, nicht einem RGBA-Bild!):

data = np.asarray(im)
im = Image.fromarray(np.roll(data, 1, axis=-1))

Wenn im.split() einfach funktionieren würde, ist dies sicherlich eine einfachere und lesbarere Option!

15
Joe Kington

Nur um eine aktuellere Antwort hinzuzufügen:

Mit der neuen cv2-Schnittstelle werden nun automatisch numpy-Arrays geladen.
OpenCV cv2.imread () lädt Bilder als BGR, während numpy.imread () sie als RGB lädt.

Die einfachste Möglichkeit zum Konvertieren ist die Verwendung von openCV cvtColor.

import cv2
srcBGR = cv2.imread("sample.png")
destRGB = cv2.cvtColor(srcBGR, cv2.COLOR_BGR2RGB)
82
Martin Beckett

Ich weiß, es ist eine alte Frage, aber ich hatte das gleiche Problem und löste es mit:

img = img[:,:,::-1]
68
Peter9192

Das war meine beste Antwort. Das funktioniert übrigens auch mit Alpha.

from PIL import Image
import numpy as np
import sys 

sub = Image.open(sys.argv[1])
sub = sub.convert("RGBA")
data = np.array(sub) 
red, green, blue, alpha = data.T 
data = np.array([blue, green, red, alpha])
data = data.transpose()
sub = Image.fromarray(data)
6
sberry
import cv2
srcBGR = cv2.imread("sample.png")
destRGB = cv2.cvtColor(srcBGR,cv2.COLOR_BGR2RGB)

Nur um die Lösung von Martin Beckets zu klären, da ich dazu nicht Stellung nehmen kann. Sie benötigen cv2. vor der Farbe konstant.

3
user2692263

Hinzufügen einer Lösung mithilfe der Ellipse

image = image[...,::-1]

In diesem Fall ist die Ellipse ... ist äquivalent zu :,: während ::-1 kehrt die Reihenfolge der letzten Dimension (Kanäle) um.

2
azygous

Mit den zuvor erläuterten Ideen ... mit Numpy könnten Sie.

bgr_image_array = numpy.asarray(bgr_image)
B, G, R = bgr_image_array.T
rgb_image_array = np.array((R, G, B)).T
rgb_image = Image.fromarray(rgb_image_array, mode='RGB')

Zusätzlich kann der Alphakanal entfernt werden.

assert bgra_image_array.shape == (image_height, image_width, 4)
B, G, R, _ = bgra_image_array.T
rgb_image_array = np.array((R, G, B)).T
1
BlaZerTech

Dies sollte mit dem Modul ImageMath möglich sein.

Bearbeiten:

Joes Lösung ist noch besser, ich habe darüber nachgedacht. :)

0
Amber
im = Image.frombuffer('RGB', (width, height), bgr_buf, 'raw', 'BGR', 0, 0)
0
Andrei Antonov