Python : Opencv BGR,青、緑、赤の分割 cv2.split(画像)

1か月ぶりの更新になってしまいました。

最近まで会社でリストラやっていた影響で、周りの人が続々といなくなるので、

公私ともにブルーなのです。

はてなブログさんより一か月も更新していませんよというのが来たので、

 書くか~と思いました。

 

今回は、Python OpencvでのBGRの分割です。

青(B)、緑(G)、赤(R)を分割する方法です。

 

まずは使うモジュールはopencvとnumpyなので、

import cv2

import numpy as np

 

画像を読み込みます。
frame = cv2.imread('lena_color.jpg')

前に使ったことのある、レナさんです。

f:id:Kangkang1981:20201006213400j:plain


画像のサイズ、チャンネル(チャンネルは不使用)を抽出します。

空の画像を作るためです。
h,w,c = frame.shape

空の画像はnumpyにて作成します。

frame.dtypeという形にすると、元の画像と同じ型になります。

zeros = np.zeros((h, w), frame.dtype) 

 

次に画像を分割します。
blue_img , green_img , red_img = cv2.split(frame)

このsplitというので分割をします。

一つ一つのイメージは1チャンネルのデータとなり、gray画像のようなデータです。

 

次にmergeという関数で、分解した色データとカラ画像を合成します。

blue_frame = cv2.merge((blue_img,zeros,zeros))

green_frame = cv2.merge((zeros,green_img,zeros))

blue_frame = cv2.merge((zeros,zeros,red_img) )

mergeは二重カッコなのですが、上のは最後のカッコは全角ですので、

コピーする際は、下のプログラムをお願いします。

よくわからないのですが、半角カッコにすると、

ちゃんと表示できなかったのですよね  

 

後は、特に必要ないのですが、縦につなげて表示すると下記のようになります。

上から順に青、緑、赤です。

f:id:Kangkang1981:20201006214114j:plain

 

詳細のプログラムは下記になります。

#opencvをインポートします。
import cv2 
import numpy as np

#画像を読み込む
frame = cv2.imread('lena_color.jpg')
#画像のサイズ、チャンネル(チャンネルは不使用)を抽出
h,w,c = frame.shape

#置き換え用のカラの画像作成
zeros = np.zeros((h, w), frame.dtype)

#BGRの分割(すべて1チャンネルの画像
blue_img , green_img , red_img = cv2.split(frame)

#青、緑、赤画像のみを抜き出し合成、
blue_frame = cv2.merge((blue_img, zeros, zeros))
green_frame = cv2.merge((zeros, green_img, zeros))
red_frame = cv2.merge((zeros, zeros, red_img))

#画像を横につなげる
frame_h = cv2.vconcat([blue_frame,green_frame,red_frame])

#画像を表示
cv2.imshow('BGR',frame_h)

#画像の保存
cv2.imwrite('lena_BGR_split.jpg',frame_h)

#キー入力を待つ
cv2.waitKey(0)
#全ての開いたウインドウ閉じる
cv2.destroyAllWindows()

 

今までにpythonについて書いた記事はここにリンクを貼ってあります。

興味があればぜひご覧ください。