OpenCV | 영상 필터링 기법 : 샤프닝

박나연·2021년 3월 29일
0

OpenCV

목록 보기
21/40
post-thumbnail
post-custom-banner

✨ 언샤프 마스크 필터

샤프닝 기법은 블러링과 반대되는 개념으로, 초점이 잘 맞은 사진처럼 사물의 윤곽이 뚜렷하고 선명한 느낌이 나도록 하는 것이다. 영상 에지(밝기가 급격이 변하는 부분) 근방에서 픽셀 값의 명암비가 커지도록 해야한다. 블러링이 적용된 영상, 즉 날카롭지 않은 영상을 언샤프 하다고 하고, 언샤프한 영상을 이용하여 역으로 날카로운 영상을 생성하는 필터를 언샤프 마스크 필터라고 한다.

먼저 입력영상에 블러링을 적용한 영상을 얻어내고, 입력영상에서 블러링 적용 영상을 뺀 결과는 오직 날카로운 성분만을 가지고 있는 함수라고 할 수 있다. 뺌으로써 얻어낸 함수를 입력영상에 더하게 되면 날카로운 성분이 강조된 최종영상을 얻을 수 있는 것이다.

그런데 여기서 단순히 더하는 것이아닌 날카로운 정도를 실수 가중치를 곱하여 조절할 수 있다.

h(x, y) = f(x, y) + alpha * g(x, y)

알파는 샤프닝 결과 영상의 날카로운 정도를 조절할 수 있는 파라미터 이다.

h(x, y) = f(x, y) + alpha(f(x, y) - blur_f(x,y))
= (1 + alpha)f(x, y) - alpha * blur_f(x, y)

OpenCV에서는 언샤프 마스크필터 함수를 따로 제공하지 않으며 위에서 정리한 수식을 소스코드 형태로 그대로 작성하여 구현해볼 수 있다.
Mat dst = (1 + alpha) * src - alpha * blurred;

void unsharp_mask() {
	Mat src = imread("rose.bmp", IMREAD_GRAYSCALE);

	if (src.empty()) {
		cerr << "Image load failed!" << endl;
		return;
	}

	imshow("src", src);

	for (int sigma = 1; sigma <= 5; sigma++) {
		Mat blurred;
		GaussianBlur(src, blurred, Size(), sigma);

		float alpha = 1.f;
		Mat dst = (1 + alpha) * src - alpha * blurred;

		String desc = format("Sigma: %d", sigma);
		putText(dst, desc, Point(10, 30), FONT_HERSHEY_SIMPLEX, 1.0, Scalar(255), 1, LINE_AA);

		imshow("dst", dst);
		waitKey();
	}

	destroyAllWindows();
}

profile
Data Science / Computer Vision
post-custom-banner

0개의 댓글