• 이번 글에서는 Separable convolution에 대하여 정리해보겠습니다.
  • Separable convolution은 filter라는 격자 판에 저장된 데이터를 이용해 RGB를 다양한 형태로 변형시키는 이미지 프로세싱의 기법중 하나입니다. 

 

 

  • 다음 그림처럼 원본 픽셀에서 가운데에 있는 Convolution kernel이라는 필터를 거치게 되면 하나의 픽셀값을 새로 만들어서 새로운 이미지를 생성해줍니다.

 

wikipedia

 

  • kernel의 종류는 다음과 같이 다양하게 있습니다. 
  • Separable convolution 효과를 사용하면 다양한 블러효과를 구현할 수 있는 걸 확인할  수 있습니다.

 

 

  • 위 그림처럼 Kernel과 주변 픽셀의 값을 1:1매칭으로 모두 더해서 평균을 구하면 그것이 새로운 이미지의 픽셀이 됩니다.
  • 그렇다면 만약 1행 1열의 픽셀을 구하려고 할 땐 어떻게 하면 될까요?

 

 

  • 영역 밖의 값들은 가장 인접한 값으로 지정하고 모두 더해서 평균을 내주면 됩니다. 위 코드는 이미지 픽셀을 불러와서 가로 5개 영역에 대한 평균을 내서 이미지를 부드럽게 해주는 Box blur 효과를 내줍니다. 가로 세로 형식의 인접 픽셀을 모두 더한 후, 나눠서 이미지를 만들면 흐릿한 효과가 나옵니다.

 

Box blur

 

  • Gaussian Blur는 특정 가중치 값을 이용해 필터 처리를 하여 흐릿한 효과를 냅니다.
  • Box Blur와의 차이점은 Box blur는 인접한 자신의 픽셀 값을 기준으로 평균적인 값을 낸다면, Gaussian blur는 특정 가중치값에 연산한 결과에 대하여 평균 값을 계산합니다.

 

Gaussian blur graph

 

  •  위에 Gaussian blur의 그래프를 보면 중심 픽셀을 기준으로 멀어질수록 가중치가 낮아지는 것을 확인할 수 있습니다.  이것은 중심 픽셀에서 가까운 값일 수록 영향을 크게 받는다는 것을 의미합니다.
  • Gaussian blur의 kernel 필터값은 다음을 사용하면 됩니다.
double coeff[] = {0.0545, 0.2442, 0.4026, 0.2442, 0.0545}
  • 즉 각각의 픽셀마다 가중치가 다르기 때문에, 박스필터로 처리할 픽셀을 적절한 kernel의 가중치 값을 각 픽셀에 곱하여 이미지를 생성하면 됩니다.

 


 

Reference:
https://en.wikipedia.org/wiki/Kernel_(image_processing) 

https://gaussian37.github.io/dl-concept-dwsconv/

https://followtutorials.com/2013/03/gaussian-blurring-using-separable-kernel-in-c.html

 

'Graphics & DirectX' 카테고리의 다른 글

[Graphics] Primary ray를 통해 Shadow 구현하기  (0) 2023.05.15
[Graphics] Bloom (shader effect)  (0) 2023.05.07