Python OpenCV 画像の連結 vconcat・hconcat

OpenCV

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:

コメント

タイトルとURLをコピーしました