소벨 검출은 3x3 크기의 행렬을 사용해 연산을 했을 때, 중심을 기준으로 각 벡터의 앞뒤 값을 비교해 변화량을 검출하는 알고리즘이다.
필터는 다음과 같다.
축별로 연산을 한 뒤에 X, Y축의 절대값의 합을 구함으로써 가장자리를 찾아낼 수 있다.
// 소벨 필터를 적용해서 엣지 검출
for (int y = 1; y < IMAGE_HEIGHT - 1; y++) {
for (int x = 1; x < IMAGE_WIDTH - 1; x++) {
int gx = -m_original[(y - 1) * IMAGE_WIDTH + (x - 1)] + m_original[(y - 1) * IMAGE_WIDTH + (x + 1)]
- 2 * m_original[y * IMAGE_WIDTH + (x - 1)] + 2 * m_original[y * IMAGE_WIDTH + (x + 1)]
- m_original[(y + 1) * IMAGE_WIDTH + (x - 1)] + m_original[(y + 1) * IMAGE_WIDTH + (x + 1)];
int gy = m_original[(y - 1) * IMAGE_WIDTH + (x - 1)] + 2 * m_original[(y - 1) * IMAGE_WIDTH + x] + m_original[(y - 1) * IMAGE_WIDTH + (x + 1)]
- m_original[(y + 1) * IMAGE_WIDTH + (x - 1)] - 2 * m_original[(y + 1) * IMAGE_WIDTH + x] - m_original[(y + 1) * IMAGE_WIDTH + (x + 1)];
// 엣지 강도 계산
m_result[y * IMAGE_WIDTH + x] = (BYTE)sqrt(gx * gx + gy * gy);
}
}