반응형

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)

반응형