안녕하세요! 오늘은 이미지를 기하학적으로 뒤틀어 모양을 바꾸는 이미지 뒤틀기(Warping) 기법인 어핀 변환과 원근 변환에 대해 알아보겠습니다.
단순히 크기를 키우거나 돌리는 수준을 넘어, 평면 이미지를 입체적으로 보이게 하거나 비뚤어진 문서를 똑바로 스캔한 것처럼 펴주는 마법 같은 기술입니다.
1. 어핀 변환(Affine Transform)
어핀 변환은 이미지의 평행성을 유지하면서 직선, 길이, 각도를 변화시키는 뒤틀기 방법입니다. 변환 전후의 좌표 3개만 지정하면 변환 행렬을 구할 수 있습니다.
📍 어핀 변환 예제 코드
import cv2
import numpy as np
img = cv2.imread('fish.jpg')
rows, cols = img.shape[:2]
# 변환 전, 후 3개의 좌표 지정
pts1 = np.float32([[100, 50], [200, 50], [100, 200]])
pts2 = np.float32([[80, 70], [210, 60], [250, 120]])
# 3개의 좌표 쌍으로 2x3 변환 행렬 계산
mtrx = cv2.getAffineTransform(pts1, pts2)
# 어핀 변환 적용
dst = cv2.warpAffine(img, mtrx, (int(cols*1.5), rows))
cv2.imshow('Origin', img)
cv2.imshow('Affine', dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
2. 원근 변환(Perspective Transform)
어핀 변환이 2차원적인 변형이라면, 원근 변환은 이미지를 3차원적으로 변환하는 방식입니다. 원근법을 적용하여 멀리 있는 것은 작게, 가까이 있는 것은 크게 보이도록 조절합니다. 이때는 좌표 4개가 필요합니다.
📍 원근 변환 예제 코드
import cv2
import numpy as np
img = cv2.imread('fish.jpg')
rows, cols = img.shape[:2]
# 원근 변환 전, 후 4개의 좌표 (좌상, 좌하, 우상, 우하)
pts1 = np.float32([[0, 0], [0, rows], [cols, 0], [cols, rows]])
pts2 = np.float32([[100, 50], [10, rows-50], [cols-100, 50], [cols-10, rows-50]])
# 3x3 원근 변환 행렬 계산
mtrx = cv2.getPerspectiveTransform(pts1, pts2)
# 원근 변환 적용 (전용 함수 cv2.warpPerspective 사용)
dst = cv2.warpPerspective(img, mtrx, (cols, rows))
cv2.imshow('Perspective', dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
3. 실무 활용: 문서 스캔 효과
원근 변환의 가장 대표적인 활용 사례는 휴대폰 문서 스캔 기능입니다. 기울어진 상태로 찍힌 종이의 네 모서리 좌표를 따서 평면 상태로 펴주는 원리입니다.
- 마우스 클릭으로 문서의 네 꼭짓점 좌표를 수집합니다.
- 수집된 좌표를 기준으로 원근 변환 행렬을 생성합니다.
- 변환을 적용하면 종이만 깔끔하게 정면에서 본 것처럼 출력됩니다.
4. 삼각형 어핀 변환 (Triangle Affine)
OpenCV의 기하학적 변환은 기본적으로 사각형 영역을 기준으로 합니다. 따라서 삼각형 모양으로 특정 영역만 뒤틀려면 조금 더 복잡한 과정이 필요합니다.
- 삼각형을 감싸는 **외접 사각형(Bounding Box)**을 구합니다.
- 사각형 영역을 관심 영역(ROI)으로 지정하여 변환합니다.
- 변환된 이미지에서 삼각형 영역만 추출하기 위해 **마스크(Mask)**를 생성하여 합성합니다.
🛠️ 핵심 요약 가이드
- 어핀 변환: 좌표 3개를 사용하며 평행성을 유지합니다. cv2.getAffineTransform()을 사용하십시오.
- 원근 변환: 좌표 4개를 사용하며 입체감을 부여합니다. cv2.getPerspectiveTransform()과 cv2.warpPerspective()를 사용하십시오.
- 좌표 지정: 변환 행렬 계산 시 사용하는 좌표 배열은 반드시 np.float32 타입이어야 오류가 나지 않습니다.
🚀 마치며
이미지 뒤틀기 기술은 단순히 재미있는 필터 효과를 넘어, 자율주행 차의 차선 인식 보정이나 카메라 정사 보정 작업에서 핵심적으로 사용됩니다. 네 꼭짓점만 제대로 잡으면 비뚤어진 세상을 똑바로 펴서 분석할 수 있게 됩니다.
궁금하신 점은 댓글로 남겨주시기 바랍니다. :)
반응형
'AI > 🤖 딥러닝' 카테고리의 다른 글
| 딥러닝 | 초간단 예측 AI 만들기 (0) | 2024.08.17 |
|---|---|
| 딥러닝 | 경사하강법 (0) | 2024.08.11 |
| 딥러닝 | 활성함수(Activation Function) (0) | 2024.08.11 |
| 딥러닝 | Neural Network 계산, Loss function (1) | 2024.08.11 |
| 딥러닝 | 뉴럴 네트워크 (0) | 2024.08.11 |