色がBGRであるイメージがあります。 PILイメージを変換して、各ピクセルのB要素とR要素を効率的な方法で交換するにはどうすればよいですか?
アルファバンドがないと仮定すると、これほど単純ではないでしょうか?
_b, g, r = im.split()
im = Image.merge("RGB", (r, g, b))
_
編集:
うーん... PILにはこの点でいくつかのバグがあるようです... im.split()
はPILの最新バージョン(1.1.7)では動作しないようです。ただし、1.1.6でも動作する可能性があります(?)...
最新の回答を追加するには:
ロードされた新しい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)
私はそれが古い質問であることを知っていますが、私は同じ問題を抱えて解決しました:
img = img[:,:,::-1]
これが私の最高の答えでした。ちなみに、これは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)
import cv2
srcBGR = cv2.imread("sample.png")
destRGB = cv2.cvtColor(srcBGR,cv2.COLOR_BGR2RGB)
コメントすることはできないので、Martin Becketsのソリューションを明確にするためです。 cv2が必要です。色定数の前。
省略記号を使用してソリューションを追加する
image = image[...,::-1]
この場合、省略記号...
は:,:
と同じですが、::-1
は最後の次元(チャネル)の順序を逆にします。
im = Image.frombuffer('RGB', (width, height), bgr_buf, 'raw', 'BGR', 0, 0)
前に説明したアイデアを使用して... 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