이 영역을 누르면 첫 페이지로 이동
컴퓨터와 수학, 몽상 조금 블로그의 첫 페이지로 이동

컴퓨터와 수학, 몽상 조금

페이지 맨 위로 올라가기

컴퓨터와 수학, 몽상 조금

컴퓨터공학, 딥러닝, 수학 등을 다룹니다.

이미지 변형 (Image Transformation)

  • 2023.03.09 16:42
  • Deep Learning/영상처리

이미지의 변형은 이미지의 각 픽셀을 이동시켜 이미지를 다른 형태로 변환하는 것이다.
이미지의 각 픽셀 좌표에 어떠한 변환 행렬을 곱하여 이러한 변환을 수행할 수 있다.

이미지 전체에 대해 같은 행렬을 이용한 변환을 수행하는 것을 Parametric Global Warping이라고 한다.
원본 이미지의 픽셀 좌표 $p$에 변형 행렬 $T$를 곱하여 $p'$로 옮기는 것이다.

$$p' = Tp$$

이때, 만약 $T$가 linear한 변형을 수행하는 행렬이라면, $p' \equiv Tp$가 성립한다.

2x2 행렬을 이용한 변환

크기 변형 (Scaling)

이미지의 $x$축과 $y$축에 대하여, 각각 $a, b$의 비율로 변형을 수행한다.

$$ \begin{bmatrix} x' \\ y' \end{bmatrix} = 
  \begin{bmatrix} a & 0 \\ 0 & b \end{bmatrix}\begin{bmatrix} x \\ y \end{bmatrix} $$

회전 (Rotation)

이미지를 특정 각도로 회전시킨다.

$$ \begin{bmatrix} x' \\ y' \end{bmatrix} = 
  \begin{bmatrix} \cos\theta & -\sin\theta \\ \sin\theta & \cos\theta \end{bmatrix}
  \begin{bmatrix} x \\ y \end{bmatrix} $$

전단 (Shear)

https://en.wikipedia.org/wiki/Shear_stress

이미지를 위 이미지와 같이 기울인다.

$$ \begin{bmatrix} x' \\ y' \end{bmatrix} = 
  \begin{bmatrix} 1 & sh_x \\ sh_y & 1 \end{bmatrix}\begin{bmatrix} x \\ y \end{bmatrix} $$

반전 (Invert)

이미지를 X축이나 Y축 기준으로 반전시킨다.

$$ \begin{bmatrix} x' \\ y' \end{bmatrix} = 
  \begin{bmatrix} -1 & 0 \\ 0 & -1 \end{bmatrix}\begin{bmatrix} x \\ y \end{bmatrix} $$

2x2 행렬 변환의 특징

$2\times 2$ 행렬을 이용한 변환은 다음과 같은 특징들이 있다.

  • 원점이 유지된다.
  • 직선이 유지된다.
  • 평행선들이 계속 평행하게 유지된다.

3x3 행렬을 사용한 변환 (Affine Transfromation)

https://gaussian37.github.io/vision-concept-image_transformation/

원점을 바꾸는 변환을 수행하기 위해서는 동차 차원을 추가하여야 한다.
이렇게 크기, 회전, 위치를 모두 바꾸는 변환을 아핀 변환이라 한다.

$$ \begin{bmatrix} x' \\ y' \\ w' \end{bmatrix} \equiv
\begin{bmatrix} 1&0&t_x\\ 0&1&t_y \\ 0&0&1 \end{bmatrix}
\begin{bmatrix} \cos\theta&-\sin\theta&0 \\ \sin\theta&\cos\theta&0 \\ 0&0&1  \end{bmatrix}
\begin{bmatrix} s_x&0&0 \\ 0&s_y&0 \\ 0&0&1 \end{bmatrix}
\begin{bmatrix} x \\ y \\ w \end{bmatrix}$$

위 식에서, 변환이 크기, 회전, 위치 순서로 일어나는 것을 알 수 있는데, 변환의 순서를 바꿀수는 있지만 바꾸게 되면 행렬의 값들도 다 바꿔줘야 한다.

아핀 변환의 특징

  • Scale이 0일 때를 제외하고, 직선들과 평행선 정보들이 계속 유지된다.

투영 변환 (Projective Transform)

투영 변환은 시점 변환(Perspective Transform)이나 Homography라고도 한다.
$3\times 3$ 행렬로 정의되며, 총 8개의 변수를 이용하여 8의 자유도(Degree of Freedom)를 갖는다.

변환 이후에는 원본 이미지에서 직선 정보만 유지되는 특징이 있다.

투영 변환을 통해 아래 3가지 경우의 변환을 수행할 수 있다.

2D 면에 대한 변환

어떤 사진 속에 존재하는 2D 평면을 다음과 같이 복원하거나, 다른 각도에서 찍은 것처럼 변환할 수 있다.

3D 물체에 대한 촬영 각도 변형

어떤 3D 물체를 찍은 이미지를 마치 같은 위치에서 다른 각도로 찍은 이미지처럼 변형할 수 있다.
이를 응용하여 아래에서 소개할 Image Stitching을 수행할 수 있다.

https://docs.opencv.org/4.x/d9/dab/tutorial_homography.html

멀리 떨어진 3D 물체에 대한 변형

위에서 3D 물체는 같은 자리에서 다른 각도로 찍은 사진처럼 변형이 가능하다고 말했지만, 멀리 떨어진 물체는 조금 이동하여서 봐도 같은 위치에서 보는 것과 큰 차이가 없다.
멀리 있는 3D 물체를 다른 장소에서 찍은 사진들도 서로 변형이 가능하다.

https://docs.opencv.org/4.x/d9/dab/tutorial_homography.html

Image Stitching

이런 투영 변환을 이용하면 서로 다른 이미지를 이어붙여 파노라마 이미지를 만들 수 있다.
이미지를 이어붙이려면, 이미지가 원래 하나인 것처럼 서로 scale이나 rotation 등이 잘 맞아야 한다.

이미지들을 이어붙이려면 각각의 크기와 각도 등을 조절해줘야 한다.

특징 추출하고 특징점들 매칭하기

SIFT를 비롯한 특징 추출기들을 이용해 이미지의 특징점들을 각각 추출하고, 매칭 알고리즘을 통해 각 이미지에서 공통되는 특징점들을 짝을 지어준다.

SIFT를 이용한 특징점 추출
매칭 알고리즘을 이용한 매칭

매칭된 쌍들을 이용한 Homography 계산

이제 두 이미지 사이에 공통된 점들을 찾았다.
이것들을 기반으로 이미지 A 속 특징점들의 좌표 $[x_i, y_i]$를 이미지 $B$ 속 특징점들의 좌표 $[x_i', y_i']$로 올바르게 변환해 줄 행렬 $H$를 찾아야 한다.

$$\begin{bmatrix} x_i' \\y_i' \\w_i' \end{bmatrix} \equiv \begin{bmatrix} h_{11}&h_{12}&h_{13}\\ h_{21}&h_{22}&h_{23}\\ h_{31}&h_{32}&h_{33}\\  \end{bmatrix} \begin{bmatrix} x_i\\y_i\\w_i \end{bmatrix} \equiv H\mathbf{x}_i \equiv \begin{bmatrix} h_1^T \\ h_2^T \\ h_3^T \end{bmatrix}\mathbf{x}_i \equiv \begin{bmatrix} h_1^T\mathbf{x}_i \\ h_2^T\mathbf{x}_i \\ h_3^T\mathbf{x}_i \end{bmatrix} $$

위 식에 의하여 아래 식이 성립한다.

$$ \begin{bmatrix} x_i' \\y_i' \\w_i' \end{bmatrix} \times \begin{bmatrix} h_1^T\mathbf{x}_i \\ h_2^T\mathbf{x}_i \\ h_3^T\mathbf{x}_i \end{bmatrix} = 0$$

위 식을 다시 외적 식을 이용하여 전개하면,

$$ \begin{bmatrix} y'h_3^T\mathbf{x}_i - w_i'h_2^T\mathbf{x}_i \\ w_i'h_1^T\mathbf{x}_i - x_i'h_3^T\mathbf{x}_i\\
x_i'h_2^T\mathbf{x}_i - y_i'h_1^T\mathbf{x}_i \end{bmatrix} = 0$$

위 행렬의 각 행에 0을 곱한 $h_1^T, h_2^T, h_3^T$ 를 각각 더해주면 아래와 같이 행렬을 분해할 수 있다.

$$ \begin{bmatrix} 0^T & -w_i'\mathbf{x}_i^T & y_i'\mathbf{x}_i^T \\ w_i'\mathbf{x}_i^T & 0^T & -x_i'\mathbf{x}_i^T \\
-y_i'\mathbf{x}_i^T & x_i'\mathbf{x}_i^T & 0^T \end{bmatrix} \begin{bmatrix}h_1 \\ h_2 \\ h_3 \end{bmatrix} = 0 $$

어우 복잡해라.. 이제 위 행렬에서 선형 독립인 행 2개만 남기고 마지막 행 하나는 버리면, 비로소 특징점 한 쌍에 대한 식이 완성되었다.

우리가 찾아낸 $n$개의 특징점 행렬 $A$와 고정된 homography 변환 행렬 $h$에 대하여 $Ah=0$이 성립한다.

특징점들의 좌표를 이용해 $A$행렬을 만들고, $Ah$를 최소화하는 $h$를 찾으면 homography 변환 행렬을 찾아낼 수 있다.

이때, $h$의 norm을 1로 고정하고 $h$의 최소값을 탐색하는데, 특이값분해(SVD)를 이용하여 $h$를 구할 수 있다.

$A$를 SVD로 분해하여 나온 행렬 $U, D, V$ 중, 마지막 행렬 $V$의 마지막 열 9개 값이 바로, $h$ 행렬을 구성하는 값이 된다.

영상처리 공부를 정리하며...

지금까지 이미지 변환과 이를 이용한 Image Stitching을 알아보았다.
원한다면 Image Stitching을 코드 단위로 설명한 필자의 이전 글을 보셔도 좋다.

이제.. 머신러닝 공부 좀 하러 가야겠다. 실로 어질어질한 일주일이었다. 휴

'Deep Learning > 영상처리' 카테고리의 다른 글

Vector of Locally Aggregated Descriptors (VLAD) 소개  (0) 2023.03.14
Bag of Visual Words (BoVW)  (2) 2023.03.10
SIFT: Scale Invariant Feature Transform을 이용한 Feature Matching  (0) 2023.03.08
SIFT: Scale Invariant Feature Transform 을 이용한 Blob Detection  (0) 2023.03.08
코너 검출 (Corner Detection)  (0) 2023.03.08

댓글

이 글 공유하기

  • 구독하기

    구독하기

  • 카카오톡

    카카오톡

  • 라인

    라인

  • 트위터

    트위터

  • Facebook

    Facebook

  • 카카오스토리

    카카오스토리

  • 밴드

    밴드

  • 네이버 블로그

    네이버 블로그

  • Pocket

    Pocket

  • Evernote

    Evernote

다른 글

  • Vector of Locally Aggregated Descriptors (VLAD) 소개

    Vector of Locally Aggregated Descriptors (VLAD) 소개

    2023.03.14
  • Bag of Visual Words (BoVW)

    Bag of Visual Words (BoVW)

    2023.03.10
  • SIFT: Scale Invariant Feature Transform을 이용한 Feature Matching

    SIFT: Scale Invariant Feature Transform을 이용한 Feature Matching

    2023.03.08
  • SIFT: Scale Invariant Feature Transform 을 이용한 Blob Detection

    SIFT: Scale Invariant Feature Transform 을 이용한 Blob Detection

    2023.03.08
다른 글 더 둘러보기

정보

컴퓨터와 수학, 몽상 조금 블로그의 첫 페이지로 이동

컴퓨터와 수학, 몽상 조금

  • 컴퓨터와 수학, 몽상 조금의 첫 페이지로 이동

검색

메뉴

  • 홈
  • 태그
  • 방명록

카테고리

  • 분류 전체보기 (282)
    • Tech Trend (3)
    • Deep Learning (77)
      • 공부 노트 (21)
      • 논문 리뷰 (44)
      • 논문 스키밍 (1)
      • 영상처리 (11)
    • Engineering (3)
      • Tips (2)
      • Experiences (1)
    • Blog (48)
      • 회고 & 계획 (20)
      • 내 이야기 (9)
      • 리뷰 (3)
      • 군대에 간 공돌이 (10)
      • ML엔지니어 취업 도전기 (1)
      • 여행 (4)
    • 학부 수업 (141)
      • 머신러닝 (16)
      • C프로그래밍 (8)
      • 자료구조 (11)
      • 알고리즘 (17)
      • 디지털시스템 (25)
      • 컴퓨터구조 (11)
      • 확률과 통계 (21)
      • 선형대수학 (14)
      • 이산수학 (18)
      • 데이터시각화 (0)
    • 강의 (9)
      • 딥러닝 기초 (7)
      • Python (2)

공지사항

인기 글

정보

백지오의 컴퓨터와 수학, 몽상 조금

컴퓨터와 수학, 몽상 조금

백지오

블로그 구독하기

  • 구독하기
  • RSS 피드

티스토리

  • 티스토리 홈
  • 이 블로그 관리하기
  • 글쓰기

나의 외부 링크

  • profile
  • github
  • linkedin

방문자

  • 전체 방문자
  • 오늘
  • 어제
Powered by Tistory / Kakao. © 백지오. Designed by Fraccino.

티스토리툴바