Elsaの技術日記(徒然なるままに)

主に自分で作ったアプリとかの報告・日記を記載

MENU

カラー画像のRGB分離と結合

今回はカラー画像をRGBに分離したり、分離した画像を結合させたりしてみたいと思います!!

■前回のおさらい

前回、画像に対するヒストグラムを作成しました。
elsammit-beginnerblg.hatenablog.com

その際、こちらのコードで一応RGBには分離しております。

b, g, r = img_bgr[:,:,0], img_bgr[:,:,1], img_bgr[:,:,2]

ただし、こちらの分離したデータをそのままimshowや画像として保存してみるとこちらのように、
それぞれグレースケールとなります。
【元画像】
f:id:Elsammit:20201018210406j:plain

【R成分】
f:id:Elsammit:20201018205427j:plain

【G成分】
f:id:Elsammit:20201018205517j:plain

【B成分】
f:id:Elsammit:20201018205539j:plain

これは、RGB成分の分離時にR、G、Bの濃淡のみの配列になってしまっているためです。
すなわち、
元データ:[[B成分],[G成分]、[R成分]]
から、
R成分:[R成分]
G成分:[G成分]
B成分:[B成分]
のように分離しているため、グレースケールとして表示されるわけです。

■カラー画像のRGB分離

正確にRGB画像として分離するためにはもうひと手間加える必要があります。
先ほどの通り、
R成分:[R成分]
G成分:[G成分]
B成分:[B成分]
のように分離してしまっているため、それぞれの成分に対して再度RGB成分を分離した形にする必要があります。

その方法はこちら!!

zeros = np.zeros((HEIGHT, WIDTH), img_bgr.dtype)
b_img = cv2.merge((b, zeros, zeros))
g_img = cv2.merge((zeros, g, zeros))
r_img = cv2.merge((zeros, zeros, r))

cv2.mergeを用いると画像データの色成分を合成させることができるようになります。
そして合成する色成分として、

zeros = np.zeros((HEIGHT, WIDTH), img_bgr.dtype)

で文字通り0の成分を生成しRGB成分として合成させます!!
これで、
R成分:[[zero],[zero],[R成分]]
G成分:[[zero],[G成分],[zero]]
B成分:[[B成分],[zero],[zero]]
となり、分離前のデータと次元が同一になります。

では、こちらの色合成を実行後の画像を確認してみます!!
結果はこちら!!

【元画像】
f:id:Elsammit:20201018210406j:plain

【R成分】
f:id:Elsammit:20201018205719j:plain

【G成分】
f:id:Elsammit:20201018205736j:plain

【B成分】
f:id:Elsammit:20201018205758j:plain

R、G、B画像として表示・保存させることができました!!

■カラー画像のRGB合成

cv2.mergeを用いれば、こちらの通り、分離させていたRGB成分を再度合成させることができます。

b, g, r = img_bgr[:,:,0], img_bgr[:,:,1], img_bgr[:,:,2]
rgb_img = cv2.merge((b_img,g_img,r_img))

実行するとこちらの通りになります。

【元画像】
f:id:Elsammit:20201018210406j:plain

【合成画像】
f:id:Elsammit:20201018205834j:plain

■最後に

今回、RGB画像分離と結合についてまとめてみました!!

これとnumpyで多次元を1次元に落とす手法を用いることで、画像データの転送に応用できそうですね!!
後で時間を見つけてやってみようかな?