이전 포스팅에서 소개한, 영상을 부드럽게 만드는 가우시안 블러링을 사용하여 샤프닝을 하는 방법을 소개하도록 하겠습니다.
블러링을 하면 인접 픽셀과의 차이를 줄여주는 역할을 하는데, 기존에도 별 변화가 없었던 부분(비슷한 색깔로 연속된 부분)은 필터링을 거쳐도 별반 차이가 없습니다. 반면 경계 부분은 필터링 전후의 픽셀값 변화가 큽니다. 즉, 원본영상에서 가우시안 블러링 영상을 뺐을 때, 픽셀의 변화가 큰 부분은 양수 또는 음수값을 띄게 됩니다.
위 영상은 원본영상에서 가우시안 블러링 영상을 빼고, 화면에 나타내기 위해서 128값을 더한 것입니다. 경계가 잘 보이지요. 이제 원본영상의 픽셀값을 1.5배로 하고, 가우시안 블러링 값은 0.5배로 해서 뺄셈을 수행하면 샤프닝이 완성됩니다.
최종 영상 = 원본영상 * (1.5) + 가우시안블러링영상 * (-0.5)
원본영상의 가중치를 1.5, 가우시안블러링 영상의 가중치를 -0.5로 주었습니다. 사실 가우시안블러링 영상의 가중치를 음수값으로 설정하고 둘의 합이 1이면 됩니다. 이 과정은 이전 포스팅에서 소개한 addWeighted함수를 사용하여 수행하였습니다.
예제 코드
#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc.hpp>
using namespace std;
using namespace cv;
int main()
{
Mat img = imread("lena512.bmp", IMREAD_GRAYSCALE);
if (img.empty())
{
cerr << "failed to read image" << endl;
return 1;
}
imshow("img", img);
Mat gaussian_blur;
GaussianBlur(img, gaussian_blur, Size(5, 5), 1);
imshow("gaussian blurring", gaussian_blur);
Mat result;
addWeighted(img, 1.5, gaussian_blur, -0.5, 0, result);
imshow("sharpening", result);
waitKey(0);
destroyAllWindows();
return 0;
}