web-dev-qa-db-ja.com

PIL回転画像の色(BGR-> RGB)

色がBGRであるイメージがあります。 PILイメージを変換して、各ピクセルのB要素とR要素を効率的な方法で交換するにはどうすればよいですか?

39
Claudiu

アルファバンドがないと仮定すると、これほど単純ではないでしょうか?

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

編集:

うーん... PILにはこの点でいくつかのバグがあるようです... im.split()はPILの最新バージョン(1.1.7)では動作しないようです。ただし、1.1.6でも動作する可能性があります(?)...

21
Joe Kington

最新の回答を追加するには:

ロードされた新しいcv2インターフェースイメージでは、numpy配列が自動的に読み込まれます。
ただし、openCV cv2.imread()はイメージをBGRとしてロードし、numpy.imread()はイメージをRGBとしてロードします。

変換する最も簡単な方法は、openCV cvtColorを使用することです。

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

私はそれが古い質問であることを知っていますが、私は同じ問題を抱えて解決しました:

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

これが私の最高の答えでした。ちなみに、これは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)

コメントすることはできないので、Martin Becketsのソリューションを明確にするためです。 cv2が必要です。色定数の前。

4
user2692263

省略記号を使用してソリューションを追加する

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

この場合、省略記号...:,:と同じですが、::-1は最後の次元(チャネル)の順序を逆にします。

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

前に説明したアイデアを使用して... numpyを使用することができます。

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')

さらに、アルファチャネルを削除できます。

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

ImageMath モジュールでこれを行うことができるはずです。

編集:

ジョーのソリューションはさらに優れています。私はそれを考え直していました。 :)

0
Amber