본문 바로가기
Domain Knowledge/Computer Vision

[2] Image Transformation

by hleej 2026. 3. 17.

[영상분석과 패턴인식] 수업 요약
created: 2026-03-16
last modified: 2026-03-18

 

1. Image Transformation

어떤 이미지를 transform하기 위해서는,

다시 말해서, 모든 pixel $X=(x, y, 1)$ 를 $X'=(x', y', 1)$ 로 변환하기 위해서는, 변환 행렬 $T_{3 \times 3}$를 곱하면 된다.

 

여기서 $X$에 굳이 1을 붙여서 3차원의 vector로 만든 이유는, Homogenous Coordinate를 사용했기 때문이다. 

Homogenous Coordinate라는 걸 직관적으로 기하학적으로 설명하면, 우리가 다루려는 이미지(2차원)을 굳이 3차원으로 투영한 것을 말한다. 이를 통해 translation같은 변환도 '행렬의 곱'으로 표현할 수 있게 된다.

 

$X' = TX$

Transform TX 설명
Translate
(평행이동)
$\displaystyle \begin{pmatrix}
1 & 0 & t_x \\
0 & 1 & t_y \\
0 & 0 & 1
\end{pmatrix}\begin{pmatrix}
x \\
y \\
1
\end{pmatrix}$
x축: $t_x$ / y축: $t_y$ 만큼 Translate한다.
역변환: $-t_x, -t_y$를 쓴다.
Scale
(확대/축소)
$\displaystyle \begin{pmatrix}
s_x & 0 & 0 \\
0 & s_y & 0 \\
0 & 0 & 1
\end{pmatrix}\begin{pmatrix}
x \\
y \\
1
\end{pmatrix}$
x축: $s_x$ / y축: $s_y$ 만큼 scaling.
역변환: $\displaystyle \frac{1}{s_x}, \frac{1}{s_y}$를 쓴다.
Rotate
(회전)
$\displaystyle \begin{pmatrix}
cos\theta & -sin\theta & 0 \\
sin\theta  & cos\theta & 0 \\
0 & 0 & 1
\end{pmatrix}\begin{pmatrix}
x \\
y \\
1
\end{pmatrix}$
$(0, 0)$을 중심으로, 시계반대방향으로 $\theta$만큼 회전.
역변환: $-\theta$를 쓴다. 그러면 $T^{-1}=T^T$임을 확인 가능하다.
Shear
(기울이기)
$\displaystyle \begin{pmatrix}
1 & s_v & 0 \\
0 & 1 & 0 \\
0 & 0 & 1
\end{pmatrix}\begin{pmatrix}
x \\
y \\
1
\end{pmatrix}$
$\displaystyle \begin{pmatrix}
1 & 0 & 0 \\
s_h & 1 & 0 \\
0 & 0 & 1
\end{pmatrix}\begin{pmatrix}
x \\
y \\
1
\end{pmatrix}$
선형결합을 생각하면, $x'=x+s_vy$ 와 같이 선형결합된 새로운 축이 되었다고 생각하면 쉽다.
$X'$는 반드시 평행사변형이 된다.
역변환: $-s_x$를 쓴다.
Projective Transformation
(원근 변환)
$\displaystyle x'=\frac{a_{11}x + a_{21}y+a_{31}}{ a_{13}x + a_{23}y+a_{33} } $

$\displaystyle y'= \frac{a_{12}x + a_{22}y+a_{32}}{ a_{13}x + a_{23}y+a_{33}}$
자유롭게 찌그러뜨린 것 같은, 임의의 사각형이 된다.
내부 구현이 어떻든, 요즘 기술들은 내부적으로 잘 한다고 한다.

 

위의 색칠된 4가지는 모두 Affine Transformation이다. (행렬 곱으로 그 변환을 나타낼 수 있다.)

만약 Affine 변환들을 반복한다면, 그 행렬들을 하나의 행렬로 만들 수 있다. 
예를 들어 이미지를 중심을 잡아서 회전하려고 한다면

Translation(w/2, h/2)→Rotation($\theta$)→Translation(-w/2, -h/2),

따라서 $X' = (TRT^T)X = AX$ 와 같이 하나의 행렬 $A_{3\times 3}$로 묶을 수 있다.

 

이는 다시 말해서, 내가 변환 이전의 임의의 세 점 $(x_1, y_1), (x_2, y_2), (x_3, y_3)$과, 이후의 세 점 $(x_1', y_1'), (x_2', y_2'), (x_3', y_3')$ 만 정한다면, Affine 변환의 조합으로 만들 수 있는 그 어떤 변환 $A$라도 거꾸로 추정해 낼 수 있음을 의미한다.

$\displaystyle A=\begin{pmatrix} a_0 & b_0 & c_0 \\ a_1 & b_1 & c_1 \\ 0 & 0 & 1 \end{pmatrix} = \begin{pmatrix} x'_0 & x'_1 & x'_2 \\ y'_0 & y'_1 & y'_2 \\ 1 & 1 & 1 \end{pmatrix} \begin{pmatrix} x_0 & x_1 & x_2 \\ y_0 & y_1 & y_2 \\ 1 & 1 & 1 \end{pmatrix}^{-1}$

이제 변환 전후의 세 점을 고르는 것만으로, 그 변환을 바로 수행할 수 있게 되었다.

 

이번엔 고정된 세 점이 아니라, 자연에서 측정된(오차가 존재하는) 아주 많은 전후의 점들이 있다고 하자.

이때 오차때문에 모든 $(x_i, y_i)\rightarrow (x_i', y_i')$와 일치하는 변환 A를 찾는 것은 불가능하다.  

대신에 Least Square를 이용해서, 가장 오차를 최소로 하는 변환 A를 찾을 수 있다.

SSE(Sum of Squared Error)와 Gradient를 이용해서, 오차를 최소로 만드는 변환 A를 구하면 아래와 같다.

$A = (X^TX)^{-1}X^Ty$

 

2. Image Quality Assessment

위에서 이미지를 변환하는 방법에 대해 알아보았다. 

하지만 이미지를 변환하다 보면, 이미지 정보가 소실되는 문제가 필연적으로 발생한다.

이미지 변환 전/후, 또는 손실 압축의 전/후에, 이미지 정보가 얼마나 소실되었는지 수치로 나타낼 수 있는 방법은 무엇이 있을까?

 

PSNR (Peak Singal-to-noise ratio)

$\displaystyle PSNR = 10log_{10}(\frac{Max^2}{MSE})$

본래 SNR은 통신 분야에서 사용되는 개념으로, 신호 대 잡음의 비율을 $\displaystyle (\frac{A_{signal}}{A_{noise}})^2$ 로 구한다. 그리고 이를 db(데시벨) 형태로 나타내기 위해 $log$를 취한 것이 SNR(db)이다.

따라서 이를 이미지에 적용한 것이 PSNR이고,  $MSE$는 $\displaystyle \frac{1}{N} \sum_{i=1}^{N}(x_i - \hat{x_i})^2$ 를, $Max$는 이미지 신호의 최댓값인 255를 말한다.

Noise가 0이면, PSNR은 무한대로 발산한다. 일반적으로 PSNR이 40보다 크면 사람의 눈으로 구별하기 힘들다고 한다.

하지만 PSNR은, 치명적인 한계가 있다. 예를 들어 이미지가 1 pixel만큼 미세하게 움직이면, $x_i-\hat{x_i}$는 완전히 왜곡되는 문제가 있다.

 

MSSIM (Mean of Structural Similiarity Index Measure)

  SSIM (Structural Similiarity Index Measure)

     SSIM은 한 픽셀 (x, y)에 대해, 주변 픽셀과의 luminance, Contrast, Structure Similariry를 구한 뒤, 합친 것이다.

    $\mathrm{SSIM}(x, y) = [l(x, y)]^{\alpha} [c(x, y)]^{\beta} [s(x, y)]^{\gamma}$,

                 when    $l(x,y)=\frac{2\mu_x\mu_y+c_1}{\mu_x^2+\mu_y^2+c_1},\quad
c(x,y)=\frac{2\sigma_x\sigma_y+c_2}{\sigma_x^2+\sigma_y^2+c_2},\quad
s(x,y)=\frac{\sigma_{xy}+c_3}{\sigma_x\sigma_y+c_3}$,

따라서 일반적으로 많이 쓰이는 SSIM은 아래와 같다.
    $\mathrm{SSIM}(x,y)=\frac{(2\mu_x\mu_y+c_1)(2\sigma_{xy}+c_2)}{(\mu_x^2+\mu_y^2+c_1)(\sigma_x^2+\sigma_y^2+c_2)},\quad \alpha=\beta=\gamma=1,\; C_3=\frac{C_2}{2}$

MSSIM은 모든 픽셀 (x, y)에 대해 구한 SSIM을 mean을 구한 것이다.

 

 

3. Pixel Processing

pixel 하나하나에 대해서도 간단한 Operation을 적용할 수 있다.

두 이미지를 더할 수도, ($X = A+B$) 

두 이미지를 더했을 때, 255보다 큰 pixel은 모두 255로 고정되어버리기 때문에, 2로 나눈 뒤에 더하는 것이 좋다.

모든 pixel에 scalar 값을 사칙연산을 적용할 수도, ($X = A \pm \alpha\:/\:X=\alpha A\:/\:X=\frac{1}{\alpha}A$)

이미지 전체를 Normalize할 수도 있다. ($X = \frac{A-\mu}{\sigma}$)

 

 

4. template matching

template이라 불리는, 작은 패턴이 담긴 이미지가, target 이미지의 어디에 등장하는 지 찾아볼 수도 있다.

이떄 template을 target 이미지의 왼쪽 위부터, 왼쪽 아래까지 한 픽셀씩 이동해가며, template과 겹쳐진 아랫 부분의 차이를 계산해 볼 수 있다.

template T 와, target 이미지 I , 그리고 겹쳐진 모든 좌표 (x, y)에 대해, 그 유사도를 아래와 같이 나타낼 수 있다.
차이를 구하는 방법은, 값이 작을 수록 유사하고,
유사도를 구하는 방법은, 값이 클수록 유사하다.

Squared Difference $\displaystyle \sum_{(x, y) \:\in T}(T(x, y)-I(x, y))^2$ 두 값 간의 차이를 나타내는 '뺄셈'한 값을 제곱한 것.
Cross Correlation $\displaystyle \sum_{(x, y) \:\in T}T(x, y)I(x, y)$ 두 수가 비슷하면 비슷할수록, 곱한 값이 커지는 '곱셈'의 성질을 이용한 것.
Normalized Cross Correlation $\displaystyle \frac{\sum_{(x, y) \:\in T}T(x, y)I(x, y)}{\sqrt{ \sum_{(x, y) \:\in T}T(x, y)^2  \sum_{(x, y) \:\in T}I(x, y)^2  }}$ template T의 픽셀 수가 많아지면 많아질 수록 값이 커져서, 분모에 크기를 나눔으로써 normalize를 취한 것.
Normalized Cross Correlation $\displaystyle 
\frac{
    \sum_{(x, y) \in T} (T(x, y)-\mu_T)(I(x, y)-\mu_I)
}{
    \sqrt{ 
        \sum_{(x, y) \in T} (T(x, y)-\mu_T)^2 
        \cdot 
        \sum_{(x, y) \in T} (I(x, y)-\mu_I)^2
    }
}$
Normalizer를 할거면 제대로 하기 위해서, 평균을 빼는 것까지 한 것.

 

 

5. Histogram

이미지에서 어떤 값이 얼마나 많이 등장하는지를 알기 위해, Histogram을 그릴 수 있다. 

예를 들어 RGB이미지의 경우에는, 아래와 같이 그릴 수 있다.

R, G, B 각 channel에 대해, 0-255의 값이 각각 몇 개씩 등장하는지, 세로로 개수를 쌓은 것을 나타낸다.

각 channel별로 따로 그릴 수도 있다.

 

위 그림을 자세히 보면, 0-255 사이에서, 이미지에 한 번도 쓰이지 않은 값들이 존재한다.

이게 아깝다고 생각된다면, Histogram Stretching을 해 볼 수 있다.

 

5.1. Histogram Stretching

강제로 특정 범위를 늘리거나 줄이는 것이다.

 

위 그림은 최댓값과 최솟값을 잡아서 각각 0과 255로 늘린 것(Min-Max Scaling)이다.
다만 이산적으로 강제로 늘렸기에, 사이사이에 값이 없는 값들이 생긴 것이 보인다. 

원한다면 Interpolation을 해 줄 수 있지만, 안해도 사람 눈으로는 구분이 힘들다.

실제로 Histogram Stretching한 이미지로 되돌려보면, Contrast(대비)가 증가한 것을 확인할 수 있다.

 

아래의 사진을 보면, 가로축을 Histogram Stretching 이전, 세로축을 이후의 pixel 값이라고 생각하면 된다.

기울기가 1보다 큰 부분은 Contrast가 늘어난(Stretching된) 부분, 만약 기울기가 1보다 작다면 Contrast가 압축된 부분이라고 할 수 있다.

 

 

5.2. Histogram Equalization

뿐만 아니라 Historgram은 균일하게 펼칠 수도 있다.

'Domain Knowledge > Computer Vision' 카테고리의 다른 글

[paper] RandLa-Net (2019/11)  (0) 2026.04.26
[paper] KPConv (Kernel Point Convolution) (2019)  (0) 2026.04.25
[paper] DGCNN (Dynamic Graph CNN) (2018/01)  (0) 2026.04.25
[4] Color Image  (0) 2026.04.02
[3] Convolution Filter  (0) 2026.04.02