[프로젝트] C++ CUDA, Fast Fourier Transform을 이용한 이미지 블러
어떻게 이미지를 흐리게 만들 수 있을까요? 우리는 다양한 이미지 처리 프로그램에서, 주어진 이미지를 흐리게 만들 수 있습니다. 흐리다는 것은 수학적으로 어떻게 정의할 수 있을까요? 아마 가장 쉽고 직관적인 답변으로는 "해상도가 낮음"이 될 수도 있을 것 같습니다. 엄밀히 말해서 우리가 이번에 다룰 이야기와는 조금 거리가 있는 답변이긴 합니다만, 분명 그럴듯하죠. 그렇다면 해상도가 낮다는 것은 왜 흐리다는 것과 비슷한 의미를 지닐 수 있을까요? 현실은 연속적입니다. 우리가 무언가를 본다는 것은, 빛을 받아들인다는 것입니다. 물리 세계의 빛이라는 것에 '화질'이라는 개념이 존재할까요? 우리가 보는 화면에서 글씨의 픽셀은 분명 구분되어 있죠. 27인치 모니터에 희거나, 검거나 하는 것들이 200만여 개로 분리되어 있습니다. 물리적으로도 그럴까요? 물리적으로 픽셀은 단 하나의 무언가는 아닙니다. 그냥 연속적인 빛일 뿐이죠. 즉, 우리는 연속적인 현실의 무언가를 샘플링해서 봅니다. 만약 샘플링된 것이 현실의 무언가를 재현할 수 있을 정도라면, 우리는 '선명하다'고 느끼죠. 하지만 그렇지 않다면, '흐릿하다'고 느낍니다. 예를 들어, 다음 그림은 주기가 빠른 파동을 샘플링하였지만, 샘플링의 주기가 부적절해 마치 다른 파동처럼 보입니다. 즉 우리가 '흐릿하다'고 느끼는 것은, 실제의 디테일을 추측하기 어렵다는 것과 같은 이야기일 것입니다. 반대로, 샘플의 디테일을 일부러 뭉갠다면 그것은 흐릿하게 보이는 요인이 되지 않겠어요? 컨볼루션(Convolution) 컨볼루션은 수학의 한 연산입니다. 우리 전공자들은 인공지능으로 인해서 더욱 익숙하죠. 다만 주의하세요! 인공지능에서 이야기하는 컨볼루션은 사실 신호 처리 분야에서 사용하는 일반적인 컨볼루션 연산과 의미적으로 약간 다릅니다. 반전되지 않는다든가 하는 문제가 있죠. 하지만 그것은 중요치 않으므로 넘어가도록 하겠습니다. 컨볼루션은...