[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)
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) 순서로 출력이 되니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)
출력값을 보면 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)
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) 순서로 출력되니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)
출력값을 보면 480x360 이미지를 960x360 이미지로 이어붙인 걸 확인할 수 있습니다.
댓글
댓글 쓰기