(100) OpenCV #5 : 画像カラーのバンド入れ替え(BGR → RGB)

投稿者: | 2018年9月18日

10,815 views

この記事は最終更新から 2373日 が経過しています。

1. やりたいこと

カラー画像を OpenCVでロードした場合、画像データ配列中の並び順は BGR である。
これを RGB の並び順に変更したい。

2. 本当に BGRなのかを確認

こんな画像を用意した。

この画像を OpenCVでロードし、画像データの中身をバンド別(=チャネル別)に見てみる。

因みに…
OpenCVでロードした画像データは numpy配列に格納されている。

import cv2
img = cv2.imread("band.png")
type(img)

実行結果、以下のように numpy.ndarray と表示された。

<class 'numpy.ndarray'>

よって、ロードした画像データから任意のバンドのデータを抽出するには、numpy配列に対する制御をすればよいのだ。

まずは 1バンド目は?

import cv2
import numpy as np
img = cv2.imread("band.png")
cv2.namedWindow('image', cv2.WINDOW_AUTOSIZE)

# 1バンド目だけを取得&表示
img1 = img[:,:,0]
cv2.imshow('image', img1)
cv2.waitKey()
cv2.destroyAllWindows()

確かに B(Blue)が入っていた。

次に 2バンド目は?

# 2バンド目だけを取得&表示
img2 = img[:,:,1]
cv2.imshow('image', img2)
cv2.waitKey()
cv2.destroyAllWindows()

確かに G(Green)が入っていた。

最後に 3バンド目は?

# 3バンド目だけを取得&表示
img3 = img[:,:,2]
cv2.imshow('image', img3)
cv2.waitKey()
cv2.destroyAllWindows()

確かに R(Red)が入っていた。

cv2.imread()でロードした画像データの中身は、確かに BGR の順に格納されていた。

3. やってみる

(1) OpenCVの関数で BGR → RGB変換

便利な関数が用意されている。

import cv2
img = cv2.imread("band.png")

# OpenCVの関数 cvtColor()でバンド変換する。
imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

(2) numpy配列のスワップで実現

前述の「2. 本当に BGRなのかを確認」で確認した通り、画像データ配列の3次元目には以下のように格納されている。
[][][0] : B (Blue)
[][][1] : G (Green)
[][][2] : R (Red)

よって…
[][][0]と [][][2]を入れ替えてやればよいのだ。

これは numpy配列に対する制御で簡単に書ける。

import cv2
import numpy as np
img = cv2.imread("band.png")

# 画像データの 3次元目を 2→1→0 の順に入れ替える。
imgRGB = img[:,:,[2,1,0]]

試しに PILで RGBカラー画像として表示してみる。

# 表示
from PIL import Image
imgP = Image.fromarray(imgRGB)
imgP.show()


OKだ!


コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です