OpenCV
前回、太陽電池解析用ライブラリSolcoreを使って太陽光、LED光、レーザー光、ハロゲン光(熱光源、黒体放射)のスペクトルをグラフ化する方法を紹介しました。
今回はOpenCVを使って画像データをR(赤)、G(緑)、B(青)のデータに分離する方法を紹介します。
まずは画像データを読み込む方法をおさらいします。
今回はこんな画像を準備してみました。
この画像ファイルのファイル名を「python-opencv12-1.jpg」とするとOpenCVを使って画像を読み込むにはこんな感じになります。
import cv2
import numpy as np
import os
default_dirpath = os.getcwd()
filename = "python-opencv12-1.jpg"
filepath = os.path.join(default_dirpath, filename)
img = cv2.imread(filepath, cv2.IMREAD_COLOR)
print(img)
実行結果
[[[157 96 52]
[157 96 52]
[156 95 51]
...
[107 56 23]
[105 57 23]
[106 58 24]]
(中略)
[[ 60 75 67]
[ 48 61 53]
[ 20 27 22]
...
[ 14 15 13]
[ 25 23 23]
[ 16 14 14]]]
これで画像データが読み込めて、各ピクセルのRGB(実は並び順はBGR)を取得することができました。
ここからRGBのデータに分離していきましょう
RGBデータの分離方法
RGBデータをそれぞれの色(RとGとB)に分離するには「cv2.split(画像)」を使用します。
これにより返り値として画像における各ピクセルの「青の値」、「緑の値」、「赤の値」が取得できます。
import cv2
import numpy as np
import os
default_dirpath = os.getcwd()
filename = "python-opencv12-1.jpg"
filepath = os.path.join(default_dirpath, filename)
img = cv2.imread(filepath, cv2.IMREAD_COLOR)
blue, green, red = cv2.split(img)
height, width, channel = img.shape
zeros = np.zeros((height, width), img.dtype)
img_blue = cv2.merge((blue, zeros, zeros))
img_green = cv2.merge((zeros, green, zeros))
img_red = cv2.merge((zeros, zeros, red))
print(img_blue)
実行結果
[[157 157 156 ... 107 105 106]
[156 157 156 ... 107 105 107]
[156 157 156 ... 105 106 108]
...
[ 14 0 5 ... 86 66 72]
[ 24 51 29 ... 57 42 23]
[ 60 48 20 ... 14 25 16]]
ここでは青の値のみを表示してみました。
各色の画像を作成する方法
次に取得した各色のデータから画像を作成してみましょう。
先ほどの実行結果を見てみると、青の値のみを取得した場合、各ピクセルの青の値のみ格納された2次元リストとなっていることがわかります。
しかし画像として表示するには「RGB(OpenCVではBRG)」の三つの値が各ピクセルごとに格納されている3次元リストとする必要があります。
そこでまずNumPyの「np.zeros」を使ってRGB全てが0となっている3次元リストを作成します。
その場合「np.zeros((縦のピクセル数, 横のピクセル数), 元の画像.dtype)」とすることで元の画像と同じ値のフォーマットで値が全て0のリストを作成することができます。
そしてこれに対して、「cv2.merge(青の値のリスト, 緑の値のリスト, 赤の値のリスト)」とすることで各色のリストを連結して、画像として表示するための3次元リストを作成することができます。
import cv2
import numpy as np
import os
default_dirpath = os.getcwd()
filename = "python-opencv12-1.jpg"
filepath = os.path.join(default_dirpath, filename)
img = cv2.imread(filepath, cv2.IMREAD_COLOR)
blue, green, red = cv2.split(img)
height, width, channel = img.shape
zeros = np.zeros((height, width), img.dtype)
img_blue = cv2.merge((blue, zeros, zeros))
img_green = cv2.merge((zeros, green, zeros))
img_red = cv2.merge((zeros, zeros, red))
print(img_blue)
実行結果
[[[157 0 0]
[157 0 0]
[156 0 0]
...
[107 0 0]
[105 0 0]
[106 0 0]]
(中略)
[[ 60 0 0]
[ 48 0 0]
[ 20 0 0]
...
[ 14 0 0]
[ 25 0 0]
[ 16 0 0]]]
最後に「cv2.imwrite(出力先パス, 画像データ)」で画像を保存します。
import cv2
import numpy as np
import os
default_dirpath = os.getcwd()
filename = "python-opencv12-1.jpg"
filepath = os.path.join(default_dirpath, filename)
img = cv2.imread(filepath, cv2.IMREAD_COLOR)
blue, green, red = cv2.split(img)
height, width, channel = img.shape
zeros = np.zeros((height, width), img.dtype)
img_blue = cv2.merge((blue, zeros, zeros))
img_green = cv2.merge((zeros, green, zeros))
img_red = cv2.merge((zeros, zeros, red))
output_blue = os.path.join(default_dirpath, "python-opencv12-1_blue.png")
cv2.imwrite(output_blue, img_blue)
output_green = os.path.join(default_dirpath, "python-opencv12-1_green.png")
cv2.imwrite(output_green, img_green)
output_red = os.path.join(default_dirpath, "python-opencv12-1_red.png")
cv2.imwrite(output_red, img_red)
実行結果
次回はOpenCVで4種のノイズ除去フィルタ(blue、GaussianBlur、medianBlur、birateralFilter)の使い方を紹介します。
ではでは今回はこんな感じで。
コメント