PythonのOpenCVで画像を連結する方法を紹介する。
ここではcv2.vconcat()とcv2.hconcat()を使い、画像を縦・横方向に連結する。vはvertical(垂直、縦)、hはhorizontal(水平、横)を意味している。
これらの関数は、引数として画像(NumPy配列ndarray)のリストを渡して使用する。
関数と主な引数
cv2.vconcat(src)
src | 画像(NumPy配列ndarray)のリスト |
cv2.hconcat(src)
src | 画像(NumPy配列ndarray)のリスト |
使用例
以下の2つの写真を例に、使用例を示す。
先にライブラリのインポートと、写真の読み込みを行う。
Code:
import cv2
import matplotlib.pyplot as plt
# 画像の読み込み
img1 = cv2.imread('./pic/landscape.jpg')
img2 = cv2.imread('./pic/rice_bowl.jpg')
同じ画像をcv2.vconcat()で縦方向の連結
同じ画像を連結する際は、画像のサイズが同じなので前処理なしで結合できる。
Code:
# 同じ画像を縦に連結する
img_v = cv2.vconcat([img1, img1])
# 連結画像の表示
plt.figure(figsize=(10,10))
plt.imshow(cv2.cvtColor(img_v, cv2.COLOR_BGR2RGB))
plt.show()
Output:
同じ画像をcv2.hconcat()で横方向の連結
横方向の連結も、縦方向と同様の処理で結合できる。
Code:
# 同じ画像を横に連結する
img_h = cv2.hconcat([img2, img2])
# 連結画像の表示
plt.figure(figsize=(10,10))
plt.imshow(cv2.cvtColor(img_h, cv2.COLOR_BGR2RGB))
plt.show()
Output:
異なる画像をcv2.vconcat()で縦方向の連結
異なる画像を連結する際は、連結面の画像サイズが等しくなるように前処理が必要になる。ここでは、小さい方の画像にサイズを合わせてリサイズする前処理を入れた、vconcat_resize()関数を定義している。
Code:
# 画像をリサイズして連結する関数の定義
def vconcat_resize(img_list, interpolation=cv2.INTER_CUBIC):
# 最短の横幅を取得
w_min = min(img.shape[1] for img in img_list)
# 画像のリサイズ
im_list_resize = [cv2.resize(img,
(w_min, int(img.shape[0] * w_min / img.shape[1])),
interpolation = interpolation)
for img in img_list]
# 連結画像を返す
return cv2.vconcat(im_list_resize)
# 関数を使用
img_v_resize = vconcat_resize([img1, img2, img1])
# 連結画像の表示
plt.figure(figsize=(10,10))
plt.imshow(cv2.cvtColor(img_v_resize, cv2.COLOR_BGR2RGB))
plt.show()
Output:
コメント