【OpenCV】画像データをR(赤)、G(緑)、B(青)のデータに分離する方法[Python]

  • URLをコピーしました!
目次

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)の使い方を紹介します。

ではでは今回はこんな感じで。

よかったらシェアしてね!
  • URLをコピーしました!

コメント

コメントする

目次