[OpenCV] 엠보싱 필터링

이번 글에서는 엠보싱(Embossing) 필터링에 대해 알아보겠습니다.

엠보싱은 인쇄물이나 철판, 종이 등에 표현하고자 하는 것을 오목하거나 볼록하게 만든 것을 말하며, 영상 처리에서 엠보싱 필터링은 이러한 형태로 필터링 한것을 말합니다.
아래 이미지는 레나 이미지를 엠보싱 필터링 처리한 이미지 입니다.

엠보싱 필터링은 픽셀 값의 변화가 작은 곳은 회색으로 설정하고, 경계와 같이 픽셀 값의 변화가 큰 곳에는 밝거나 어둡게 설정합니다.
엠보싱 필터링에 사용되는 마스크는 아래와 같습니다.

3 X 3 엠보싱 필터 마스크

영상에서 픽셀 값의 변화가 적은 평탄한 곳에서는 엠보싱 필터 마스크를 쓰면 아래와 같이 0에 가까운 값이 됩니다.

영상에서 픽셀 값의 변화가 큰 곳에서는 0보다 작거나, 255보다 큰 값이 됩니다.

하지만 실제로 해당 픽셀에는 -765가 들어가지 않고 포화 연산으로 인하여 0이 됩니다.
그래서 엠보싱 필터링은 위와 같이 연산환 결과값에서 128을 더하여 평탄한 영역은 회색으로 표현하고, 값이 급변하는 영역은 흰색, 또는 어두운 색으로 표시하게 합니다.

위 설명에 대한 코드는 아래와 같습니다.

Mat src = imread("lenna.bmp", IMREAD_GRAYSCALE);
if (src.empty())
{
	cerr << "image open error" << endl;
	return;
}

// -1, -1,  0
// -1,  0,  1
//  0,  1,  1
// 위 방식으로 필터링을 하면 이미지가 급변하는 구간에서는 밝거나 어두운 색으로 설정
float data[] ={-1, -1, 0, -1, 0, 1, 0, 1, 1};
Mat emboss_mask(3, 3, CV_32FC1, data);

Mat dst;
filter2D(src, dst, -1, emboss_mask, Point(-1, -1), 128);

imshow("src", src);
imshow("dst", dst);

waitKey();
destroyAllWindows();

실행 결과는 아래와 같습니다.