[OpenCV] 에지 검출 – 개념 설명

이번 글에서는 에지(edge) 검출에 대해 개념을 간단히 알아보겠습니다.

에지는 경계면, 윤곽선을 의미합니다. 에지를 구별하는 것은 사람에게는 쉬운 일입니다. 영상 처리에서 에지를 구별하려면 어떻게 해야 할까요? 영상에서 에지는 픽셀 값이 급격하게 바뀌는 부분을 의미합니다.

아래와 같은 1차원 연속함수가 있습니다.

연속함수의 값이 변하는 부분을 에지라고 했을 때 에지를 검출하는 방법은 미분을 하면 됩니다.
1차원 연속함수 f(x)대한 미분 f'(x)에서 0이 아닌 부분은 에지라고 판단 할 수 있습니다.

1차원 연속함수에서 이러한 변화율(미분)을 수식으로 표현하면 아래와 같습니다.

1차원 연속함수 미분

하지만 영상은 1차원이 아닌 2차원이며, 영상에서 에지를 찾기 위한 가장 간단한 형태는 가로 또는 세로 방향으로 미분 해야합니다. 이렇게 x축 또는 y축을 고정하면 한쪽 방향으로 미분하는 것을 편미분이라고 합니다.

x축 방향에 대한 편미분과 y축 방향에 대한 편미분을 수식으로 표현하면 아래와 같습니다.

x편미분, y편미분

영상에서는 보통 중앙 차분(자기 자신을 제외한 앞 픽셀과 뒤 픽셀의 변화율을 계산) 방식을 사용하여 미분을 계산합니다.

x, y 편미분을 위한 필터 마스크는 아래와 같습니다.

좌측 x편미분 필터 마스크, 우측 y편미분 필터 마스크

위에서 설명한 내용을 코드로 표현하면 아래와 같습니다.

Mat src = imread("lenna.bmp", IMREAD_GRAYSCALE);

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

float data[] = {-1, 0, 1};
Mat mx = Mat(1, 3, CV_32FC1, data); // x편미분 필터 마스크
Mat my = Mat(3, 1, CV_32FC1, data); // y편미분 필터 마스크

Mat dx, dy;
filter2D(src, dx, -1, mx, Point(-1, -1), 128);
filter2D(src, dy, -1, my, Point(-1, -1), 128);

// 이미지 표시
imshow("src", src);
imshow("x", dx);
imshow("y", dy);

waitKey();
destroyAllWindows();

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