※当サイトではアフィリエイト広告を利用しています。

画像処理

【opencv】画像をチャンネル方向に結合する方法

こんにちは、タナカです。

今回は画像をチャンネル方向に結合する方法について解説します。

チャンネル方向に結合する方法はいくつかあります。
その中でも、以下のライブラリを使って結合する方法を紹介します。

  • opencv
  • numpy
  • pytorch

 

この記事の内容
  • 画像をチャンネル方向に結合する方法がわかる

1. opencvを使って画像をチャンネル方向に結合する

こちらのリンゴの画像を使って、opencvで画像を結合する方法を紹介します。

初めに画像を青、緑、赤の各成分に分解しておきます。

import cv2

# 画像の読み込み
img = cv2.imread(r'apple-1834639_640.jpg')

# それぞれの成分で取り出し
b, g, r = cv2.split(img)

# 画像の保存
cv2.imwrite('b.jpg', b)
cv2.imwrite('g.jpg', g)
cv2.imwrite('r.jpg', r)
image-split

opencvで結合する方法はこちらになります。

bgr = cv2.merge([b, g, r])
channel-direction

これで、チャンネル方向に結合することができます。

2. numpyを使って画像をチャンネル方向に結合する

numpyを使っても結合することができます。

numpyの場合は、少し次元数を工夫してあげる必要があります。理由は、各成分の画像の形状を確認することで分かります。

b, g, r = cv2.split(img)

print(b.shape)
# >>(640, 640)
print(g.shape)
# >>(640, 640)
print(r.shape)
# >>(640, 640)

 

各成分ごとに取り出した画像は1次元になるため、(高さ、幅)のみとなります。

これをチャンネル方向に結合するためには、(高さ、幅、チャンネル)とする必要があります。

b = b.reshape(b.shape[0], b.shape[1], 1)
print(b.shape)
# (640, 640, 1)

g = g.reshape(g.shape[0], g.shape[1], 1)
print(g.shape)
# (640, 640, 1)

r = r.reshape(r.shape[0], r.shape[1], 1)
print(r.shape)
# (640, 640, 1)

 

チャンネル方向の次元を作ったあとに、下記で結合します。

bgr = np.concatenate((b, g, r), axis = 2)

 

axis = 2はチャンネル方向を意味しています。

ちなみにaxis = 0は、縦(行)方向に結合し、axis = 1は、横(列)方向に結合します。

row-column-cat

3. pytorchを使って画像をチャンネル方向に結合する

pytorchでも画像を結合することができます。

これは機械学習で、入力サイズを変えたいときに使ったりします。

b_tensor = torch.tensor(b)
b_tensor = b_tensor.unsqueeze(2)
# torch.Size([640, 640, 1])

g_tensor = torch.tensor(g)
g_tensor = g_tensor.unsqueeze(2)
# torch.Size([640, 640, 1])

r_tensor = torch.tensor(r)
r_tensor = r_tensor.unsqueeze(2)
# torch.Size([640, 640, 1])

bgr_tensor = torch.cat([b_tensor, g_tensor, r_tensor], dim = 2)

 

unsqueezeでnumpyと同じようにチャンネル方向に次元を作っています。

最後にtorch.catで画像をチャンネル方向に結合しています。numpyと違ってdimという引数で結合方向を指定します。

まとめ

今回は、画像をチャンネル方向に結合する方法を紹介しました。

画像の結合は、実装方法を結構忘れてしまうので備忘録もかねて書きました。

参考にしてみてください。