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だ!