본문 바로가기

IT/Image Processing

[OpenCV/C] Convolution Filter

요즘에 CNN과 관련된 일을 하고 있습니다. CNN의 핵심은 Convolution이기 때문에 이번 포스팅은 복습하는 겸 Convolution에 대해서 포스팅하겠습니다.


1. Convolution & Correlation


1-1. Convolution, 합성곱이라고 합니다. 


위키피디아에서 Convolution(영문)을 찾아보면 보면 정의는 다음과 같이 되어있습니다.



- 1D Convolution




- 2D Convolution





1-2. Correlation, 상관분석이라고 합니다.



수식 정의는 다음과 같습니다.


- 1D Correlation



- 2D Correlation




수식을 잘 보면, 단지 +와 -에 대한 차이밖에 없습니다. 그리고 만약 input function이 symmetricaly하다면 Convolution의 정의에 따라 input function이 flip이 되더라도 input function의 모양은 같기 때문에 Convolution과 Correlation은 같게 됩니다. 하지만 Convolution과 Correlation을 사용하는 용도와 의미는 서로 다릅니다.


다음 유투브 영상은 Convolution과 Correlation에 대해서 보여주고 있는 영상입니다.





 




Correlation



위의 영상을 보면, input function(파란색)과 taget function(빨간색)을 그대로 두고, impulse function을 시간 축에 따라

움직이며, input function과 겹치는 면적을 그래프로 나타냄을 알 수 있습니다.


.



 

 


 [ input function:: F ]

 [ impulse function :: H ]


 


 [ Correlation ]



Correlation은 target function과 input function이 똑같은 시점에 오면 Amplitude가 Peak값을 갖습니다. 즉, input function과 target function이 얼마나 유사한지에 대해서 측정할 수 있는 도구가 Correlation이 됩니다.


Correlation은 다음과 같은 예시로 사용될 수 있습니다.


만약에 우리가 다음과 같은 어떤 Full Image와 오른쪽에 작은 Patch의 Image를 받았다고 가정합니다. 여기서 우리가 알고싶은 것은 저 Full Image에서 작은 Patch Image의 위치가 어디인지 알고 싶을 때, Correlation 기법을 이용하여 구할 수 있습니다. 만약에 우리가 input function을 Full Image로 impulse function을 작은 Patch Image로 매핑하고 Correlation을 구하면, 아래와 같은 결과값을 얻을 수 있습니다.


하단 그림을 보면, 특정 지점에서 Amplitude가 Peak값을 찍고 있는 것을 확인할 수 있습니다. 이 Peak값을 찍고 있는 위치가 Full Image에서 Patch이미지가 위치하고 있는 위치가 됩니다.


 

 

 Full Image

Patch Image

 

 Result





Convolution


Convolution은 LTI(선형시불변) 시스템에서 input function과 impulse function(H(x))를 연산하는 것을 의미합니다. 이를 통해 나온 출력은 예측되는 해당 시스템의 출력값이 됩니다.


만약 system function H(x)가 Rectangle function이고 input function이 Impuse function의 집합일 때, 우리는 다음과 같은 출력값을 얻을 수 있게 됩니다.





하지만 여기서 input function은 symmerical function이기 때문에, Convolution 연산 시, flip이 되더라도 같은 의미를 갖게 될 것입니다. 하지만 다른 system function H(x) 혹은 input function가 적용되면 이야기는 달라지게 됩니다.


우리가 망치로 어떠한 물체를 길게 누르면서 친다고 가정해봤을 때, impulse function이 아래 그림과 같은 input function과 , 어떠한 물체에 대한 System function H(x)과 같다고 가정해봅시다. 여기서 input function을 보았을 때, 우리가 망치로 무언가를 치면, 해당 함수는 처음에 peak값을 찍고 서서히 떨어지는 모습을 볼 수 있습니다. 이를 시간적인 개념에서 보았을 때, System은 그대로 있고, 망치로 치는것이지 망치로 길게 누르면서 치는 input function은 당연히 flip되서 sliding window로 미끄러져야 system output이 정확하게 나올 것입니다.


이것이 바로 Convolution입니다.

즉, Convolution은 어떤 System function H(x)에 대해서 입력 input function을 주었을 때, 어떠한 output이 나오는가?를 연산해주는 연산자가 됩니다.


 


 



 



  System function H(x)

 input function f(x)

 


 Convolution Operation

 


 Result








[Reference]


1. http://www.cs.umd.edu/~djacobs/CMSC426/Convolution.pdf

2. https://www.youtube.com/watch?v=lsj7XjRbf9o

3. https://www.youtube.com/watch?v=O9-HN-yzsFQ

4. https://www.youtube.com/watch?v=MQm6ZP1F6ms&t=482s

5. https://www.youtube.com/watch?v=C3EEy8adxvc

6. https://www.youtube.com/watch?v=zoRJZDiPGds&t=559s

7. http://setosa.io/ev/image-kernels/

8. https://en.wikipedia.org/wiki/Convolution