Affine Transform 어파인 변환 (또는 아핀 변환)은 컴퓨터 비젼과 로봇, 그래픽스 등에서 사용하는 좌표 변환 기술 입니다. 일반적인 영상처리에서는 그 좌표점에 Intensity를 다뤘다면 기하학 변환에서는 좌표의 변경을 통해 물체의 위치, 크기, 기울기, 방향 등을 변환하는 기법으로 볼 수 있습니다.
선형 변환과 이동을 조합하여 2차원 또는 3차원 변환을 할 수 있어 수학적으로는 선형 대수 Linear Algebra와 밀접합니다. 간략하게 정의를 보게 되면, 변환된 좌표 (x’, y’)는 원래 좌표 (x, y)에 대해 다음과 같이 표현할 수 있습니다.
[ x'; y'] = [a b; c d][x; y] + [e; f]
여기서 [a b; c d] : 선형 변환 행렬, [e; f]: 이동 벡터
위 변환을 동차 좌표 homogeneous coordinates로 바꾸면 아래의 같이 하나의 행렬곱으로 표현 가능합니다.
[x'; y'; 1] = [a b e; c d f; 0 0 1][x; y; 1]
동차 좌표계 Homogeneus coordinates 는 우리가 일반적으로 사용하는 카르테시안 좌표계와 달리 추가적인 차원을 포함하여 변환을 쉽게 수행할 수 있습니다. 특히 Affine Transform과 Projective Transform 같은 변환을 하나의 행렬 연산으로 통합하기 위해 사용됩니다.
선형 변환 행렬은 변환 종류에 따라 아래와 같습니다. 이동 Translation은 이동 벡터에 따른 위치 변환이며, 이 외 변환은 중심에 변화가 없는 선형 변환으로 볼 수 있습니다. Affine Transform의 주요 특징은 1) 변환 후에도 직선은 그대로 직선인 직선성 유지, 2) 평행한 선은 변환 후에도 평행 유지, 3) 확대 및 축소 시 모양 유지, 4) 변환 후에도 역변환 가능 정도로 요약할 수 있습니다. 기하학 변환은 실무에서 이미지 왜곡 보정, 물체 추적, 이미지 파노라마, 카메라 켈리브레이션, 증강 현실 등에 활용되며 3D 게임에 기본 이론으로도 볼 수 있습니다.
Translation | (이동 변환) 위치를 이동 |
Scaling | (크기 변환) 크기를 조절 |
Rotation | (회전 변환) 축을 중심으로 회전 |
Shearing | (기울임 변환) 평행 형태 기울임 변형 |
Reflection | (반사) 대칭 이동 |
아래는 Affine Transform 중 이미지 위치 변환에 대한 Python, Matlab, C# 코드 활용 예입니다. 파이썬에서는 warpAffine 함수를 사용할 수 있으며, 매트랩에서는 affine2d와 imwarp을 활용 할 수 있습니다. C와 C#에서는 OpenCV를 활용하여 쉽게 테스트 해 볼 수 있습니다.
import cv2
import numpy as np
# 이미지 로드
image = cv2.imread("lena.jpg")
# 변환 행렬 생성 (x축 50px 이동, y축 30px 이동)
M = np.float32([[1, 0, 50], [0, 1, 30]])
# Affine 변환 적용
transformed_image = cv2.warpAffine(image, M, (image.shape[1], image.shape[0]))
# 결과 출력
cv2.imshow("Original Image", image)
cv2.imshow("Affine Transformed Image", transformed_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
% 이미지 로드
image = imread('lena.jpg');
% Affine 변환 행렬 생성
T = affine2d([1 0 0; 0 1 0; 50 30 1]); % x축 50px, y축 30px 이동
% Affine 변환 적용
transformed_image = imwarp(image, T);
% 결과 출력
subplot(1,2,1), imshow(image), title('Original Image');
subplot(1,2,2), imshow(transformed_image), title('Affine Transformed Image');
using OpenCvSharp;
class Program
{
static void Main()
{
// 이미지 로드
Mat image = Cv2.ImRead("image.jpg", ImreadModes.Color);
// 변환 행렬 생성 (x축 50px 이동, y축 30px 이동)
Mat affineMatrix = new Mat(2, 3, MatType.CV_32F, new float[] { 1, 0, 50, 0, 1, 30 });
// Affine 변환 적용
Mat transformedImage = new Mat();
Cv2.WarpAffine(image, transformedImage, affineMatrix, new Size(image.Width, image.Height));
// 결과 출력
Cv2.ImShow("Original Image", image);
Cv2.ImShow("Affine Transformed Image", transformedImage);
Cv2.WaitKey(0);
}
}
'영상처리 기술' 카테고리의 다른 글
칼라처리와 특징 Color Processing - RGB, CMY, HSI (2) | 2023.12.03 |
---|---|
이미지 개선 Adaptive Image Enhancement (HE, CLAHE) (0) | 2023.11.12 |
패턴 정합 Pattern Matching Method ( Template Matching ) (0) | 2017.12.06 |
영상처리 시스템 Image Processing System (0) | 2017.05.04 |
영상처리 Image Processing 란? (0) | 2017.05.03 |