[opencv-python] np vstack, hstack을 이용한 이미지 이어 붙이기



이미지 이어 붙이기


1. vstack


vstack은 vertical stack으로 수평을 기준으로 배열을 쌓는다고 생각하면 됩니다.
즉, 열의 수가 같은 두 개 이상의 배열을 위에서 아래로 연결합니다.

vstack을 수행하기 위해서는 prameter인 tup에 쌓고자 하는 두 개 이상의 배열을 넣으면 되는데,
반드시 두 번째 shape이 동일해야 합니다.
두 번째 shape이 동일해야 하는 이유는 배열을 수평으로 쌓으려면 열이 같아야 하기 때문입니다.


import numpy as np

arr1 = np.array([[1, 1, 1]])
arr2 = np.array([[3, 3, 3]])
arr3 = np.array([[6, 6 ,6], [6, 6, 6]])
print("{0}, arr1.shape = {1}".format(arr1, arr1.shape))
print("{0}, arr2.shape = {1}".format(arr2, arr2.shape))
print("{0}, arr3.shape = {1}".format(arr3, arr3.shape))

vstack_arr1 = np.vstack((arr1, arr2))
print("{0}, vstack_arr1.shape = {1}".format(vstack_arr1, vstack_arr1.shape))

vstack_arr2 = np.vstack((arr1, arr2, arr3))
print("{0}, vstack_arr2.shape = {1}".format(vstack_arr2, vstack_arr2.shape))

# 출력
# [[1 1 1]], arr1.shape = (1, 3)
# [[3 3 3]], arr2.shape = (1, 3)
# [[6 6 6]
#  [6 6 6]], arr3.shape = (2, 3)

# [[1 1 1]
#  [3 3 3]], vstack_arr1.shape = (2, 3)

# [[1 1 1]
#  [3 3 3]
#  [6 6 6]
#  [6 6 6]], vstack_arr2.shape = (4, 3)

이미지를 불러와 수평(열)으로 이어붙이고 싶다면
import cv2

cat_img = cv2.imread("image/cat.jpg")
print("cat_img.shape = {0}".format(cat_img.shape))
vstack_cat = np.vstack((cat_img, cat_img))
print("vstack_cat.shape = {0}".format(vstack_cat.shape))

cv2.imshow("vstack_cat", vstack_cat)
cv2.waitKey()

# 출력
# cat_img.shape = (360, 480, 3)
# vstack_cat.shape = (720, 480, 3)
shape은 행, 열(height, width) 순서로 출력이 되니
출력값을 보면 480x360 이미지를 480x720 이미지로 이어붙인 걸 확인할 수 있습니다.


2. hstack


hstack은 horizontal stack으로 수직을 기준으로 배열을 쌓는다고 생각하면 됩니다.
즉, 행의 수가 같은 두 개 이상의 배열을 오른쪽에서 왼쪽으로 연결합니다.

hstack을 수행하기 위해서는 prameter인 tup에 쌓고자 하는 두 개 이상의 배열을 넣으면 되는데, 반드시 첫 번째 shape이 동일해야 합니다.
첫 번째 shape이 동일해야 하는 이유는 배열을 수직으로 쌓으려면 행이 같아야 하기 때문입니다.


import numpy as np

arr1 = np.array([[1], [1], [1]])
arr2 = np.array([[3], [3], [3]])
arr3 = np.array([[6, 6], [6, 6], [6, 6]])
print("{0}, arr1.shape = {1}".format(arr1, arr1.shape))
print("{0}, arr2.shape = {1}".format(arr2, arr2.shape))
print("{0}, arr3.shape = {1}".format(arr3, arr3.shape))

hstack_arr1 = np.hstack((arr1, arr2))
print("{0}, hstack_arr1.shape = {1}".format(hstack_arr1, hstack_arr1.shape))

hstack_arr2 = np.hstack((arr1, arr2, arr3))
print("{0}, hstack_arr2.shape = {1}".format(hstack_arr2, hstack_arr2.shape))

# 출력
# [[1]
#  [1]
#  [1]], arr1.shape = (3, 1)
# [[3]
#  [3]
#  [3]], arr2.shape = (3, 1)
# [[6 6]
#  [6 6]
#  [6 6]], arr3.shape = (3, 2)

# [[1 3]
#  [1 3]
#  [1 3]], hstack_arr1.shape = (3, 2)

# [[1 3 6 6]
#  [1 3 6 6]
#  [1 3 6 6]], hstack_arr2.shape = (3, 4)

이미지를 불러와 수직(행)으로 이어붙이고 싶다면
import cv2

cat_img = cv2.imread("image/cat.jpg")
print("cat_img.shape = {0}".format(cat_img.shape))
hstack_cat = np.hstack((cat_img, cat_img))
print("hstack_cat.shape = {0}".format(hstack_cat.shape))

cv2.imshow("hstack_cat", hstack_cat)
cv2.waitKey()

# 출력
# cat_img.shape = (360, 480, 3)
# hstack_cat.shape = (360, 960, 3)
shape은 행, 열(height, width) 순서로 출력되니
출력값을 보면 480x360 이미지를 960x360 이미지로 이어붙인 걸 확인할 수 있습니다.



참고문헌

[1] https://docs.scipy.org/doc/numpy/reference/generated/numpy.vstack.html


댓글

이 블로그의 인기 게시물

[opencv-python] 이미지 크기조절(resize) 하는 법

[python]파이썬: csv reader header skip (첫번째 행 무시하기, 안읽기)

[python] selenium close와 quit 차이점