컴공지식/컴퓨터비전

Sobel 엣지 검출기(Sobel Edge Detector) 구현

개강한 공대생 2024. 9. 25. 23:28

int main() {
    Mat image, blur, grad_x, grad_y, abs_grad_x, abs_grad_y, result;
    image = imread("lena.png", 0);  // 이미지를 흑백으로 불러옴
    GaussianBlur(image, blur, Size(5, 5), 5, 5, BORDER_DEFAULT);  // 가우시안 블러로 노이즈 제거

    // Sobel 연산 수행 (x 방향 미분)
    // blur: 입력 이미지, grad_x: x 방향 결과 저장
    // 1: x 방향으로 1차 미분, 0: y 방향으로는 미분하지 않음, 3: 커널 크기
    Sobel(blur, grad_x, CV_16S, 1, 0, 3);
    convertScaleAbs(grad_x, abs_grad_x);  // 절대값을 구해서 8비트 이미지로 변환

    // Sobel 연산 수행 (y 방향 미분)
    // 0: x 방향 미분 안함, 1: y 방향으로 1차 미분
    Sobel(blur, grad_y, CV_16S, 0, 1, 3);
    convertScaleAbs(grad_y, abs_grad_y);  // 절대값을 구해서 8비트 이미지로 변환

    // x, y 방향 결과를 합쳐서 최종 엣지 검출 결과를 생성
    addWeighted(abs_grad_x, 0.5, abs_grad_y, 0.5, 0, result);

    // 결과 출력
    imshow("X", abs_grad_x);
    imshow("Y", abs_grad_y);
    imshow("Input image", image);
    imshow("Sobel Edge Detector", result);

    waitKey(0);  // 키 입력 대기
}

 

코드를 보면 Sobel 함수로 x, y 방향의 그래디언트를 계산하는 부분이 보이고

addWeighted 함수로 x 방향과 y 방향의 결과를 합쳐서 최종 엣지 이미지를 만드는 것도 볼 수 있다.