Chapter1-2. Computer Vision(Filtering, Warping)

이진한·2025년 12월 23일

모빌리티 지능

목록 보기
3/11

지난 포스트에서는 Image이고 1개의 Matrix이고, 이를 활용하여 동일한 Size의 matrix를 생성하여, Image를 변조시킬 수 있다고 하였다. Image를 변조하는 방법에는 크게 2가지가 있는데 Filteringwarping이다.

FilteringWarping에 대한 차이를 정리해보자면 다음과 같다.

  • Filtering : Image Pixel의 location은 그대로이지만, Pixel의 값을 바꾸는 Image 변조 기술
  • Warping : Image Pixel의 위치를 바꾸는 변조 기술

즉, Filtering은 왼쪽 그림에서 보는 것과 같이 원본 Image인 F(x)F(x)를 filtering 함수인 hh에 넣으면 Pixel 값이 변경된다. 반면에, Warping은 픽셀의 위치인 xx를 Warping 함수인 hh에 넣으면 Pixel의 위치가 변경된다.

1. Filtering

1.0 Convolution Operator

Filtering 기술의 일부로써 Noise를 추가하는 기술이 있다. 대표적으로는 Salt and Pepper noise를 추가하는 방식인데, 일부 Random한 값은 하얀색으로 일부 Random한 값은 검정색으로 Noise를 추가하는 방식이다.

Salt and Pepper noise 이외에도 흰색 pixel이 무작위로 나타나는 Impulse noise나 Gaussian distribution에서 추출한 강도 변화를 활용하는 Gaussian noise 역시 Filtering 기술의 일종이다.

이러한 Filtering에서 많이 사용하는 연산이 있는데, 이 연산이 바로 Convolution Operator이다.

  • Convolution Operator: (fg)(t)=f(τ)g(tτ)dτ(f * g)(t) = \int_{-\infty}^{\infty} f(\tau)\, g(t-\tau)\, d\tau

식이 복잡해보이지만, Image에서의 Convolution Operator의 적용을 이해하기는 쉽다.

kernal과 원본 이미지에서 겹치는 부분끼리 Linear Combination으로 계산해주고, Sliding Window 방식으로 Kernal을 이동시키는 방식을 활용한다.

혹시 이해시지 못하시는 분이 있으실까봐 제가 좋아하는 유튜브인 3blue1brown의 영상을 참고하시면 좋을 거 같습니다.
https://www.youtube.com/watch?v=KuXjwB4LzSA

그렇다면, 이제 어떠한 filter(kernal)가 존재하고, 이를 적용하였을 때의 효과를 살펴보겠다.

1.1 Average filter


Average filter는 말 글대로 Filter 1칸의 값이 1을 전체 filter의 갯수로 나눈 것으로 설계할 수 있다. 이러한 Average filter를 활용하여 Convolution 연산을 진행하였을 경우에는 경계가 흐릿해지는 효과를 발생시킬 수 있다.

Convolution 연산을 최종적으로 진행하면 위와 같이 output 이미지의 픽셀 값들을 input 이미지의 픽셀 값들과 비교해보면 값이 작아지며 전체적으로 퍼져있는 양상을 볼 수 있다. 즉, Average filter를 활용하여 Convolution 연산을 진행하였을 경우 Blur 처리된 효과를 얻을 수 있다.

1.2 Sharpening filter

Sharpening filter를 활용한다면 경계가 뚜렷해지는 효과를 얻을 수 있다.

현재 Sharpening filter가 설계된 모습을 보면 filter의 정중만 2배이고 나머지는 0인 filter에서 Average filter를 빼서 설계된 모습을 볼 수 있다. 이를 직관적으로 생각해보자면, 해당 위치의 Pixel값은 2배이고 주변 Pixel은 평균값을 빼서 1개의 Pixel만 두드러지는 효과를 생각해볼 수 있다.

1.3 Gaussian filter


Gaussian은 학부 2학년 시절 기계과 선배님께서 SLAM과 관련된 내용을 어느 정도는 알아두면 좋다고 말씀하신 적이 있어서 따로 공부한 적이 있어서 수업에서는 배우지 않았지만, 따로 적어보고자 한다. Gaussian의 수식 자체는 처음보면 난해하긴 하지만, 가장 큰 특징이라면 원점에서 멀어질 수록 값이 작아진다는 특징이 있다.
이러한 특징을 활용해서 주변과 linear combination을 하되 center 픽셀, 즉 원본 위치의 기존 픽셀 값을 가장 크게 반영할 수 있도록 Filter를 설계한다. 이론적으로, 가우시안 함수는 아무리 무한대로 멀어지도 값이 0 이상이지만, 실제로는 크기에 대한 한계가 존재하기 때문에 다음과 같이 사용한다.

필터 안의 값들이 모두 1이 넘는데 필터를 적용한 값은 픽셀 하나 에 적용되는 값이므로 116\frac{1}{16}을 통해서 Normalization 시켜준다.
이러한 Gaussian Filter를 적용한 결과는 Average Filter처럼 blur 처리를 하지만, Gaussian은 원래 픽셀과 가까울 수록 값을 크게 반영해 조금 더 원본을 살리는 효과가 있다.

1.4 Edge Filter

Edge는 이미지의 중요한 특징 중 하나이다. 이러한 Edge를 검출해내기 위해서 사용하는 filter가 Edge Filter이다. Edge Filter에는 다양한 종류가 있지만, 그 중에서 Sobel Filter를 위주로 다루어보고자 한다.

Edge Filter의 핵심적인 아이디어를 간단하게 설명해보면, Edge부분은 색상의 변화가 크다. 즉, Gradient가 크다는 성질을 이용하면 Edge를 잘 검출해낼 수 있을 것이다.
위의 Figure에서 보자면, Edge 부분은 Discontinuity하다. 즉, 값이 불연속적인 부분이라는 것이다. 값이 불연속적인 지점을 활용하기 위하여 미분을 활용한다.

f(x)=limh0f(x+h)f(x)hf'(x) = \lim_{h \to 0} \frac{f(x+h)-f(x)}{h}

하지만, 적용하려는 이미지는 Discrete한 값이므로 limlim를 없애고 hh를 2로 두면 다음과 같은 식으로 변경할 수 있다.

f(x)=f(x+1)f(x1)2f'(x) = \frac{f(x + 1) - f(x -1)}{2}

위와 같은 식을 적용할 수 있는 Filter는 다음과 같을 것이다.

하지만 이러한 filter를 적용한다고 생각하였을 때 발생할 수 있는 문제는 다음과 같다.

실제 원본 이미지에는 Noise가 많기 때문에 이를 미분하게되면 아래와 같이 모든 구간에서 미분값이 엄청 크게 나타나게 된다. 따라서 미분을 하기 전에 Gaussian을 이용하여 Blur 처리를 먼저 진행한다.

Gaussian Blur를 처리하게 되면 아래와 같이 깔끔하게 값을 도출할 수 있다.
이를 활용하여 Sobel filter를 설계한다면 아래와 같이 될 것이다.

  • Horizental Sobel Filter
  • Vertical Sobel filter

이러한 filter를 적용한 결과를 보면 아래와 같다.

이러한 Sobel Filter를 활용한다면, Image Gradient를 구할 수가 있다.
먼저 xxyy 방향으로 derivative filter를 선택한다.

이후에 해당 Filtering을 적용하여 xxyy방향으로 미분한 값들을 구한다.

이렇게 구한 값을 통해서 Gradient와 Edge의 direction, magnitude까지 구할 수 있다.

이를 적용해본다면 아래와 같은 결과를 얻을 수 있다.

이러한 Edge는 Object를 구별시키켜주는 특징 중의 하나이며, 주로 Lane Detection(차선 검출)에 많이 활용이 된다.

고영민 교수님 수업에서 진행한 내용은 다음과 같다. 원본 이미지를 활용하여 Canny Edge(Edge Filter의 일종)을 활용해보는 것이다.

  • Original Image
  • Canny Edge

2. Warping

Warping은 초반에 설명하였듯이 Pixel의 위치를 바꾸는 변환 과정이다.
Linear Algebra를 배웠다면 아래의 Matrix Equation은 익숙할 것이다.

Ax=b\mathbf{A}\mathbf{x} = \mathbf{b} (A\mathbf{A} : 이미지를 어떻게 변환할 것인가?, x\mathbf{x}: Image의 좌표값, b\mathbf{b} : 변환된 이미지 좌표값)

즉, matrix A\mathbf{A}를 Liear Transform의 개념을 활용하여 생각해보자면 이미지의 좌표값인 x\mathbf{x} vector를 어떻게 변환시켜서 우리가 원하는 좌표값인 b\mathbf{b} vector를 만들것인가이다.

Linear Transform은 Linearity인 homogeneityAdditivity 조건을 만족하는 성질이다.

L(x+y)=L(x)+L(y)x,yVL(x + y) = L(x) + L(y) \quad \forall x, y \in V
L(αx)=αL(x)xV, αRL(\alpha x) = \alpha L(x) \quad \forall x \in V,\ \alpha \in \mathbb{R}

Warping의 방식에는 아래 그림과 같이 여러 종류가 있다.
해당 포스트에서는 translation, Rotation, Projective에 대해서만 가볍게 다루도록 하겠다.

2.1 Translation

아까 전에도 설명하였듯이 Matrix를 곱한다는 것은 Linear Transform을 의미한다. 하지만 모든 것이 Linear Transform이 가능한 것은 아니다.
대표적으로 다루려고하는 Translation의 경우 Linear Transform으로 나타낼 수 없다.
예를 들어서 생각해보자 x,yx, y를 1씩 이동시키고 싶을 때 이를 만족시키는 matix AA가 존재할까?

A[xy]=[x+1y+1]A \begin{bmatrix} x \\ y \end{bmatrix} = \begin{bmatrix} x + 1\\ y + 1 \end{bmatrix}

당연히 이를 만족시키는 matrix AA는 존재하지 않을 것이다. 따라서 Translation을 Matrix Multiplication으로 나타내고 싶다면 이를 Euclidian Coordinate에서 Homogeneous Coordinate로 바꾸어주어야 할 것이다.

Homogenous Coordinate는 마지막 Element에 1을 추가해주면된다.
(자세한 내용은 Camera Parameter 부분에서 나올 것이다.)

[xy1]\begin{bmatrix} x \\ y \\ 1 \end{bmatrix}

만약 Homogeneous Coordinate로 표현하였다면 다음과 같이 Translation도 Matrix Multiplication으로 표현이 가능해진다.

[101011001][xy1]=[x+1y+11]\begin{bmatrix} {1} & {0} & {1} \\ {0} & {1} & {1} \\ {0} & {0} & {1} \end{bmatrix} \begin{bmatrix} x\\ y\\ 1 \end{bmatrix} = \begin{bmatrix} x+1\\ y+1\\ 1 \end{bmatrix}

2.2 Rotation

Robot은 Rigid Body이다. 따라서 Robot Software 개발 시에 Translation과 Rotation이 가장 중요하다고 볼 수 있다. 우선은 Rotation Matrix를 유도해보도록 하겠다.

Linear Algebra에서 다루는 기초적인 내용이기도 하지만 우선 점의 선형변환부터 유도해보고자한다.

x=[xy]x = \begin{bmatrix} x\\ y \end{bmatrix}

즉 위의 좌표가 원점을 중심으로 θ\theta만큼 회전시키는 행렬을 어떻게 유도할 것인지에 관한 내용이다.
먼저 x,yx, yx,yx', y'을 radius와 angular로 표현하면 다음과 같이 표현할 수 있을 것이다.

  • x=rcos(Φ),y=rsin(Φ)x = r\cos(\Phi), y = r\sin(\Phi)
  • x=rcos(Φ+θ),y=rsin(Φ+θ)x' = r\cos(\Phi + \theta), y' = r\sin(\Phi + \theta)

여기서 고등학교 시절 미적분에서 배운 Trigonometric sum and difference identities을 사용하면 다음과 같이 전개할 수 있을 것이다.

  • x=rcosΦcosθrsinΦsinθx' = r\cos\Phi\cos\theta - r\sin\Phi\sin\theta
  • y=rcosΦsinθ+rsinΦcosθy' = r\cos\Phi\sin\theta + r\sin\Phi\cos\theta

그렇다면 이 식을 활용해서 다음과 같이 쓸 수 있을 것이다.

  • x=xcosθysinθx' = x\cos\theta - y\sin\theta
  • y=xsinθ+ycosθy' = x\sin\theta + y\cos\theta

최종적으로 이것을 matrix로 표현한다면 다음과 같이 쓸 수 있고 Rotation matrix를 구할 수 있을 것이다.

[xy]=[cosθsinθsinθcosθ][xy]=Rx\begin{bmatrix} x'\\ y' \end{bmatrix} = \begin{bmatrix} \cos\theta & -\sin\theta\\ \sin\theta & \cos\theta \end{bmatrix} \begin{bmatrix} x\\ y \end{bmatrix} = \mathbf{R}\mathbf{x}

그렇다면 이를 이용해서 Basis를 변환해보자. 즉, 좌표계를 변환시켰을 때 아래 그림처럼 점 P\mathbf{P}가 어떻게 보일 것인가?와 관련한 것이다. 이는 Robot 중심의 좌표계를 설정하기 위해서도 많이 사용한다. Robot 중심의 좌표를 잡는 이유는 Robot이 움직이지, 주변 환경이 움직이지 않기 때문이다.

먼저 basis가 e1\mathbf{e_1}, e2\mathbf{e_2}인 Coordinate에서 (x,y)(x, y)로 나타나는 점 P\mathbf{P}를 basis가 e1,e2\mathbf{e'_1}, \mathbf{e'_2}인 좌표계에서 (x,y)(x', y')으로 나타내고자한다.

회전된 좌표계에서 점 P\mathbf{P}를 보면 다음과 같다.

p=[xy]=xe1+ye2=[e1e2][xy]\mathbf{p} = \begin{bmatrix} x'\\ y' \end{bmatrix}= x'e'_1 + y'e'_2= \begin{bmatrix} \mathbf{e_1'} & \mathbf{e_2'} \end{bmatrix} \begin{bmatrix} x\\ y \end{bmatrix}

이때 basis인 e1,e2\mathbf{e'_1}, \mathbf{e'_2}e1,e2\mathbf{e_1}, \mathbf{e_2}θ\theta만큼 회전변환 된 것이므로 다음과 같이 수식을 작성할 수 있다.

[xy]=[cosθsinθsinθcosθ][xy]\begin{bmatrix} x\\ y \end{bmatrix} = \begin{bmatrix} \cos\theta & -\sin\theta\\ \sin\theta & \cos\theta \end{bmatrix} \begin{bmatrix} x'\\ y' \end{bmatrix}

여기서 우리가 구하고 싶은 것은 결국 x,yx', y'이므로 회전행렬의 역행렬을 곱해주면 된다.

[xy]=[cosθsinθsinθcosθ][xy]\begin{bmatrix} x'\\ y' \end{bmatrix} = \begin{bmatrix} \cos\theta & \sin\theta\\ -\sin\theta & \cos\theta \end{bmatrix} \begin{bmatrix} x\\ y \end{bmatrix}

2.3 Perspective Transform(Homography)

Homography란 한 평면 위에 있는 점이 다른 평면으로 mapping시키는 것이다.

즉, 쉽게 설명하자면 위의 그림처럼 PP1에 있는 모든 점을 PP2에 있는 평면 위로 모든 점을 mapping시킬 수 있는 matrix를 구하는 것이다.

Perspective matrix는 오른쪽에 보이는 수식과 같이 8DOF를 가진다. Homography를 구한다는 것은 오른쪽 수식과 같은 p11,p12,p13,p21,p22,p23,p31,p32p_{11}, p_{12}, p_{13}, p_{21}, p_{22}, p_{23}, p_{31}, p_{32}를 구한다는 것과 같다.
여기서

[wxwyw]\begin{bmatrix} wx'\\ wy'\\ w \end{bmatrix}

는 2번 평면 위의 점이다. 즉, mapping되기를 원하는 점의 위치라고 할 수 있다.

[xy1]\begin{bmatrix} x\\ y\\ 1 \end{bmatrix}

은 1번 평면의 좌표라고 보면 된다. 따라서 1번평면(PP1)과 2번평면(PP2) 간의 4쌍 이상의 점들을 알고 있다면 Homography를 계산할 수 있다.

1개의 좌표쌍에는 2개의 식이 나온다. 따라서 Parameter가 8개를 필요로 하므로 최소 4개의 좌표쌍을 필요로 한다.

그렇다면 이것은 어떻게 구할 수 있을까? 우리가 일반적으로 풀어온 Matrix Equation x=Px\mathbf{x'} = \mathbf{P} \mathbf{x}에서 x\mathbf{x}을 구해왔었다. 여기서는 P\mathbf{P}의 Parameter를 구하기 위해서 DLT(Direct Linear Transform) 기법을 활용한다.
예를 들어서 확인해보자.

해당 matrix를 풀어서 쓰면 다음과 같이 쓸 수 있을 것이다.

x=α(h1x+h2y+h3)x' = \alpha(h_1​x+h_2​y+h_3​)
y=α(h4x+h5y+h6)y' = \alpha(h_4​x+h_5​y+h_6​)
1=α(h7x+h8y+h9)1 = \alpha(h_7​x+h_8​y+h_9​)

여기서 마지막 식이 1임을 활용하면

x(h7x+h8y+h9)=(h1x+h2y+h3)x'(h_7​x+h_8​y+h_9​)=(h_1​x+h_2​y+h_3​)
y(h7x+h8y+h9)=(h4x+h5y+h6)y'(h_7​x+h_8​y+h_9​)=(h_4​x+h_5​y+h_6​)

최종적으로 이 식을 정리하면 다음과 같이 쓸 수 있다.

h7xx+h8yx+h9xh1xh2yh3=0h_7​xx'+h_8​yx'+h_9​x'−h_1​x−h_2​y−h_3​=0
h7xy+h8yy+h9yh4xh5yh6=0h_7​xy'+h_8​yy'+h_9​y'−h_4​x−h_5​y−h_6​=0

이것을 matrix 형태로 정리하면 다음과 같다.


이때 만족하는 h\mathbf{h}가 없다면 유사한 solution을 구하면 된다.
(교수님께서 정확하게 알려주셨지는 않았지만, Least Square Method를 활용하면 충분히 구할 수 있을 거 같다.)

수업에서는 막 깊이 있게까지 증명하시지는 않았지만, 스스로 증명한 내용들과 여러 자료들을 찾아보면서 정리하다보니, 생각보다 길어진 거 같다. 다음 포스트부터는 최대한 요약해서 정리할 수 있도록 하고, 선형대수도 다른 시리즈에서 한 번 다룰 기회가 있다면 정리해보도록 하겠다.

profile
Department of Robotics(Kyungpook national univercity)

0개의 댓글