블러링(Blurring)과는 반대로, 영상의 윤곽을 좀 더 뚜렷하게 보이도록 처리하는 기법을 샤프닝(Sharpening)이라고 합니다. 샤프닝을 할 때 가우시안필터를 많이 사용하지만 따로 소개를 하고, 본 예제에서는 좀 더 기본적인 방법을 소개하려고 합니다.
3×3 마스크 행렬의 가운데 값을 9로 설정하고 그 외 부분은 -1로 설정하여 가운데 픽셀에 좀 더 가중치를 주는 방식으로 샤프닝 영상을 만들었습니다. 이렇게 하게 되면 다소 지저분한 샤프닝 영상이 만들어집니다.
이를 완화하기 위하여 addWeighted 함수를 사용하였습니다. 해당 함수는 두 개의 matrix에 각각 가중치(weight; alpha)를 부여한 다음, 이를 합쳐서 영상을 만들어냅니다.
void cv::addWeighted (
InputArray src1, double alpha,
InputArray src2, double beta,
double gamma, OutputArray dst,
int dtype = -1)
식으로 표현하면 다음과 같습니다. dst = src1*alpha + src2*beta + gamma;
예제 코드
#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);
float data[9] = {-1, -1, -1, -1, 9, -1, -1, -1, -1};
Mat kernel(3, 3, CV_32FC1, data);
// Sharpening
Mat sharp;
filter2D(img, sharp, -1, kernel, Point(-1, -1), 0);
imshow("sharpening", sharp);
// Weighed sharpening
Mat dst;
addWeighted(img, 0.6, sharp, 0.4, 0, dst);
imshow("weighted sharpening", dst);
waitKey(0);
destroyAllWindows();
return 0;
}
실행 결과
addWeighted 함수를 사용해서 마지막 영상을 만들었습니다. 원본 영상은 가중치를 0.6, 지저분한 중간 영상을 0.4로 가중치를 부여하여 오른쪽 영상을 만들었습니다. 원본 영상보다는 선명해졌고, 가운데 영상보다는 조금 더 깨끗한 영상이 만들어졌습니다.