본문 바로가기
CV(컴퓨터비전)

이미지 전단변환

by Tripleler 2022. 3. 6.

지난 포스팅에서는 Rotate(회전 변환)기법에 대해서 알아보았는데요, 

이번 포스팅에서는 Shear(전단 변환)기법에 대해 알아보겠습니다.

 

지난 포스팅 링크

이미지 회전하기 (tistory.com)

 

이미지 회전하기

1. 좌표 회전변환과 좌표축 회전변환 이미지를 처리하는 방법에 있어서 여러가지가 있을텐데요, 이번 포스팅에서는 이미지를 회전하는 법에 대해서 알아보겠습니다. 우선 회전에 대한 개념은

tripleler.tistory.com

 

 

 

 

Image Shear은 번역하면 전단 변환이라고 합니다.

말이 어려운데 기하학적으로 기울이는 평행사변형이라고 보시면 됩니다.

 

전단변환행렬 - 위키백과, 우리 모두의 백과사전 (wikipedia.org)

 

파란 그림을 검은 점을 원점으로 하여 전단 변환하였을 때

녹색 그림처렴 변하게 됩니다.

 

 

변환행렬 - 위키백과, 우리 모두의 백과사전 (wikipedia.org)

 

x축 전단변환의 경우 각\( \theta \) 만큼 회전할 때 사진의 높이 및 및변의 길이는 그대로이나

전체 너비가 tan(\( \theta \)) 만큼 증가하게 됩니다.

 

y축 전단변환의 경우 각\( \theta \) 만큼 회전할 때도 마찬가지로

높이가 tan(\( \theta \)) 만큼 증가하게 됩니다.

 

이제 전단행렬을 직접 코드로 구현해 봅시다.

 

import sys
import cv2
import math
import random
import numpy as np

# read image
img = cv2.imread('../icon/logo.png')
if img is None:
    print('Image load failed!')
    sys.exit()

# resize
img = cv2.resize(img, dsize=(0, 0), fx=0.5, fy=0.5, interpolation=cv2.INTER_AREA)
height, width, _ = img.shape
print(img.shape)

shear = 0

while True:
    # scale
    R = np.eye(3)
    R[:2] = cv2.getRotationMatrix2D(angle=0, center=(width / 2, height / 2), scale=0.5)

    # Shear
    S = np.eye(3)
    S[0, 1] = math.tan(shear * math.pi / 180)  # x shear (deg)
    S[1, 0] = math.tan(shear * math.pi / 180)  # y shear (deg)
    shear += 1

    M = S@R
    img2 = cv2.warpAffine(img, M[:2], dsize=(width, height), borderValue=(114, 114, 114))

    cv2.imshow('raw', img[:, :, ::-1])
    cv2.imshow('shear', img2[:, :, ::-1])
    cv2.moveWindow('raw', 50, 250)
    cv2.moveWindow('shear', 700, 250)

    key = cv2.waitKey()
    if key == 27:
        break
cv2.destroyAllWindows()

shearing x
shearing y
shearing x&y

 

명확한 차이를 보이기 위해 크기를 50% 줄이고, 1도씩 변환하며 관측해 본 결과입니다.

 

np.eye(n) 함수는 n X n 단위행렬을 만들어 주는 함수입니다.따라서 크기가 3인 단위행렬이 만들어지고,전단변환을 먼저 한 뒤에 0.5만큼 크기변환이 되도록 구현했습니다.

 

한가지 눈여겨 볼 점은 위에 위키백과의 사진과 반대로 움직이는 것처럼 보이실 텐데요, cv2라이브러리는 축을 움직입니다.원점을 중앙(width/2, height/2)으로 생각한 뒤에 축을 움직인다고 상상해보세요.머리속에 그려지는 상상과 gif가 일치하나요?

 

참고로 탄젠트 함수는 주기가 \( \pi \)인 주기함수이며, \( n \pi + \frac{\pi}{2}\) (단, n은 정수) 에서 정의 되지 않습니다.

이 정의되지 않은 부분에 가까워질수록 값이 무한 혹은 음의무한으로 발산하다 보니

중간에 사진이 사라졌다가 다시 나타나는 현상이 나타납니다.

'CV(컴퓨터비전)' 카테고리의 다른 글

파이썬 사진 밝기 조절하기  (0) 2022.04.11
동영상 잘라내기  (0) 2022.04.05
Affine Transformation  (0) 2022.03.14
이미지 회전하기  (0) 2022.02.03
OpenCV 기초 : 사진과 동영상 읽어오기  (0) 2022.01.07

댓글