[ OpenCV ] Basic 3 - 이미지 이동 (Shift)
반응형
Image Shift
OpenCV를 이용하여 이미지를 이동하는 방법에 대해 설명드리겠습니다. imutils를 이용하여 간단하게 이미지를 이동 할 수 있지만 기본이 되는 affine transformation matrix (cv2.warpAffine)을 사용하는 방법을 포함하여 설명드리도록 하겠습니다.
affine transformation matrix 이라고 하는 2 x 3 행렬을 정의해야 합니다.
이 행렬은 이미지가 왼쪽 또는 오른쪽으로 몇 픽셀을 이동될 것인지, 또는 이미지를 위 또는 아래로 몇 픽셀이 이동할 것인지 정의합니다.
- 음수 t{x} 값은 이미지를 왼쪽 으로 이동
- 양수 t{x} 값은 이미지를 오른쪽 으로 이동
- 음수 t{y} 값은 이미지 를 위로 이동
- 양수 t{y} 값은 이미지 를 아래로 이동
이미지를 오른쪽으로 shiftX 픽셀, 아래로 shiftY 픽셀 이동한다고 가정해 보겠습니다. 변환 행렬은 다음과 같습니다. (NumPy 배열로 구현됨)
M = np.float32([[1, 0, shiftX],
[0, 1, shiftY]])
Import packages
import cv2
import numpy as np
import imutils
import matplotlib.pyplot as plt
Jupyter Notebook 및 Google Colab에서 이미지를 표시할 수 있도록 Function으로 정의
def img_show(title='image', img=None, figsize=(8 ,5)):
plt.figure(figsize=figsize)
if type(img) == list:
if type(title) == list:
titles = title
else:
titles = []
for i in range(len(img)):
titles.append(title)
for i in range(len(img)):
if len(img[i].shape) <= 2:
rgbImg = cv2.cvtColor(img[i], cv2.COLOR_GRAY2RGB)
else:
rgbImg = cv2.cvtColor(img[i], cv2.COLOR_BGR2RGB)
plt.subplot(1, len(img), i + 1), plt.imshow(rgbImg)
plt.title(titles[i])
plt.xticks([]), plt.yticks([])
plt.show()
else:
if len(img.shape) < 3:
rgbImg = cv2.cvtColor(img, cv2.COLOR_GRAY2RGB)
else:
rgbImg = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
plt.imshow(rgbImg)
plt.title(title)
plt.xticks([]), plt.yticks([])
plt.show()
Load Image
cv2_image = cv2.imread('asset/images/test_image.jpg', cv2.IMREAD_COLOR)
Shift
이미지를 오른쪽으로 25픽셀, 아래로 50픽셀 이동
M = np.float32([[1, 0, 25],
[0, 1, 50]])
shifted = cv2.warpAffine(cv2_image, M, (cv2_image.shape[1], cv2_image.shape[0]))
img_show(["Original", "Shifted Down and Right"], [cv2_image, shifted])
이미지를 왼쪽으로 50픽셀, 위로 90픽셀 이동
M = np.float32([[1, 0, -50], [0, 1, -90]])
shifted = cv2.warpAffine(cv2_image, M, (cv2_image.shape[1], cv2_image.shape[0]))
img_show(["Original", "Shifted Up and Left"], [cv2_image, shifted])
그러나 변환 행렬을 수동으로 구성하고 cv2.warpAffine 메서드를 호출하는 것은 약간의 노력이 필요하며 코드를 복잡하게 만듭니다. imutils를 이용하면 간편하게 이미지를 이동 할 수 있습니다.
Shift images using imutils
imutils를 이용하여 이미지를 100픽셀 아래로 이동
shifted = imutils.translate(cv2_image, 0, 100)
img_show("Shifted Down", shifted)
반응형
'Tech & Development > Image Processing' 카테고리의 다른 글
[ OpenCV ] Basic 5 - 이미지 상하, 좌우 대칭 (Flip) (0) | 2022.03.02 |
---|---|
[ OpenCV ] Basic 4 - 이미지 회전 (Rotate) (0) | 2022.03.02 |
[ OpenCV ] Basic 2 - 기본 그리기 (선, 점, 사각형, 원) (0) | 2022.01.10 |
[ OpenCV ] Basic 1 - 픽셀(Pixel)값 가져오고 설정하기 (0) | 2022.01.10 |
[ Python ] ASCII Character Art 만들기 (100줄) (0) | 2021.12.10 |
댓글
이 글 공유하기
다른 글
-
[ OpenCV ] Basic 5 - 이미지 상하, 좌우 대칭 (Flip)
[ OpenCV ] Basic 5 - 이미지 상하, 좌우 대칭 (Flip)
2022.03.02 -
[ OpenCV ] Basic 4 - 이미지 회전 (Rotate)
[ OpenCV ] Basic 4 - 이미지 회전 (Rotate)
2022.03.02 -
[ OpenCV ] Basic 2 - 기본 그리기 (선, 점, 사각형, 원)
[ OpenCV ] Basic 2 - 기본 그리기 (선, 점, 사각형, 원)
2022.01.10 -
[ OpenCV ] Basic 1 - 픽셀(Pixel)값 가져오고 설정하기
[ OpenCV ] Basic 1 - 픽셀(Pixel)값 가져오고 설정하기
2022.01.10