こんにちは、タナカです。
今回は画像をチャンネル方向に結合する方法について解説します。
チャンネル方向に結合する方法はいくつかあります。
その中でも、以下のライブラリを使って結合する方法を紹介します。
- 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)
opencvで結合する方法はこちらになります。
bgr = cv2.merge([b, g, r])
これで、チャンネル方向に結合することができます。
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は、横(列)方向に結合します。
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という引数で結合方向を指定します。
まとめ
今回は、画像をチャンネル方向に結合する方法を紹介しました。
画像の結合は、実装方法を結構忘れてしまうので備忘録もかねて書きました。
参考にしてみてください。