메뉴 닫기

OpenCV 영상 샤프닝(Sharpening) 예제 – 2

이전 포스팅에서 소개한, 영상을 부드럽게 만드는 가우시안 블러링을 사용하여 샤프닝을 하는 방법을 소개하도록 하겠습니다.

블러링을 하면 인접 픽셀과의 차이를 줄여주는 역할을 하는데, 기존에도 별 변화가 없었던 부분(비슷한 색깔로 연속된 부분)은 필터링을 거쳐도 별반 차이가 없습니다. 반면 경계 부분은 필터링 전후의 픽셀값 변화가 큽니다. 즉, 원본영상에서 가우시안 블러링 영상을 뺐을 때, 픽셀의 변화가 큰 부분은 양수 또는 음수값을 띄게 됩니다.



위 영상은 원본영상에서 가우시안 블러링 영상을 빼고, 화면에 나타내기 위해서 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;
}

실행 결과



답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다