메뉴 닫기

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

블러링(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로 가중치를 부여하여 오른쪽 영상을 만들었습니다. 원본 영상보다는 선명해졌고, 가운데 영상보다는 조금 더 깨끗한 영상이 만들어졌습니다.



답글 남기기

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