Presentation is loading. Please wait.

Presentation is loading. Please wait.

6장. 공간 영역 기반처리(3) - 에지 추출 임은경 6장 공간영역 기반 처리(3) - 에지 추출.

Similar presentations


Presentation on theme: "6장. 공간 영역 기반처리(3) - 에지 추출 임은경 6장 공간영역 기반 처리(3) - 에지 추출."— Presentation transcript:

1 6장. 공간 영역 기반처리(3) - 에지 추출 임은경 6장 공간영역 기반 처리(3) - 에지 추출

2 차례 및 목적 차례 에지 개념 1차 미분 소벨(Sobel) 에지 추출 프리윗(Prewitt) 에지 추출
로버츠(Roberts)에지 추출 컴퍼스(Compass)에지 추출 2차 미분과 라플라시안(Laplacian)에지 추출 LOG와 DOG 캐니(Canny)에지 추출 라인(Line) 에지 추출 컬러 영상에서의 에지 추출 CxImage에서 제공하는 함수 분석 및 구현하기 6장 공간영역 기반 처리(3) - 에지 추출

3 에지 개념 에지 가장 자리라는 의미 또는 윤곽선이라 함
영상의 밝기가 낮은 값에서 높은 값으로, 또는 그 반대로 변하는 지점에 존재하는 부분을 가리킴 화소값 217 192 137 42 화소의 위치 6장 공간영역 기반 처리(3) - 에지 추출

4 에지 개념 영역 검출 기법 대부분 칼라 값의 변화, 밝기의 변화가 큰 부분이 특정한 물체의 경계를 나타내고, 일정한 분포를 가진 부분은 경계면을 나타남 따라서 영상 내에서 밝기 변화 값의 차이가 큰 부분만을 찾으면 영상내의 물체들의 경계를 추출 이와 같이 영상 내에서 주변 칼라 값의 차이가 큰 부분을 찾는 방법을 에지(edge: 영역의 경계에 해당) 검출 기법이라 함. 6장 공간영역 기반 처리(3) - 에지 추출

5 에지 개념 에지 라인 에지(line edge) 루프 에지(roof edge) 스텝 에지(step edge)
밝기값이 갑자기 변하나 특정 구간을 지나 다시 원래의 값으로 되돌아오는 부분 루프 에지(roof edge) 잡음 제거 후의 라인 에지 부분 스텝 에지(step edge) 밝기값이 갑자기 변하는 부분 램프 에지(ramp edge) 잡음 제거 후의 스텝 에지 부분 6장 공간영역 기반 처리(3) - 에지 추출

6 1차 미분 1차 미분 밝기 변화율 즉 기울기를 검출하기 위한 방법 아래의 그림 참고
6장 공간영역 기반 처리(3) - 에지 추출

7 1차 미분 기울기를 이용한 에지 검출 방법 기울기가 크다는 것은 밝기 값의 변화가 크게 일어난다는 의미로, 영역의 경계 면이 존재한다는 것을 나타냄 에지는 상대적으로 다른 명암도를 가진 두 영역간의 경계이기 때문 6장 공간영역 기반 처리(3) - 에지 추출

8 1차 미분 영상에서는 기울기를 그레디언트라 하며, 그레디언트의 크기를 구하면 바로 에지를 얻을 수 있다.
Gradient magnitude 에지의 강도 Gradient direction 에지의 방향 수학적인 연산에서의 미분은 수행될 수 없지만, 간단하게 인접 화소끼리의 차를 취하여 1차 미분에 근사한 값을 구함 차분 또는 편미분이라 함 공식은 다음과 같음 6장 공간영역 기반 처리(3) - 에지 추출

9 1차 미분 수평 방향 미분 수직 방향 미분 1차 미분에 의한 에지 추출 방법 6장 공간영역 기반 처리(3) - 에지 추출

10 1차 미분 6장 공간영역 기반 처리(3) - 에지 추출

11 1차 미분 가까이 있는 인접한 화소간의 차이를 이용하므로 경계 부위가 좁고 날카롭게 분포함
인접한 화소간의 밝기값이 큰 경우에만 좋은 효과 유도 6장 공간영역 기반 처리(3) - 에지 추출

12 1차 미분 구현하기 BYTE **CEdge::GS_gradient_edge( BYTE **gray_image, int height, int width, int method ){ int i, j; int mask_height, mask_width; BYTE vertical_var, horizontal_var, ret_var; CColor cColor; BYTE **edge_image = cColor.GS_alloc2D( height, width ); mask_height = mask_width = 3; for(i=0; i<height-mask_height; i++) { for(j=0; j<width-mask_width; j++) { // Vertical Edge Map vertical_var = abs( gray_image[i+1][j] – gray_image[i+1][j+2] ); 6장 공간영역 기반 처리(3) - 에지 추출

13 1차 미분 // Horizontal Edge Map
horizontal_var = abs(gray_image[i+2][j+1] - gray_image[i][j+1]); // gradient magnitude ret_var = vertical_var + horizontal_var; If( method == 0 ) edge_image[i][j] = vertical_var; else if( method == 1 ) edge_image[i][j] = horizontal_var; else if( method == 2 ) edge_image[i][j] = ret_var; } return edge_image; 6장 공간영역 기반 처리(3) - 에지 추출

14 1차 미분 그 외의 다양한 수식 a b A B C c d D E F G H I 6장 공간영역 기반 처리(3) - 에지 추출

15 1차 미분 1차미분 마스크의 기본 조건 1차미분은 수평과 수직에지를 찾아 이를 합친 밝기 변화량 즉 기울기를 구하는 방법
마스크 설계가 가능함 에지를 얻기 위한 마스크의 기본 조건 마스크의 크기의 가로 세로가 같고, 홀수여야 함 중심 계수를 기본으로 상하좌우가 대칭 중심계수의 값은 항상 0을 포함한 양수임 중심 계수 이외의 값은 음수 모든 계수내의 합은 0  소벨, 프리윗, 로버츠, 츠레이첸, 스터캐스틱 등 다양한 마스크 존재함 6장 공간영역 기반 처리(3) - 에지 추출

16 소벨 에지 추출 소벨 에지 추출 에지 추출의 가장 대표적인 1차 미분 연산자 중 하나 소벨 마스크 모양 -1 1 1 2 1
1 1 2 1 -2 2 -1 1 -1 -2 -1 수직 마스크 수평 마스크 6장 공간영역 기반 처리(3) - 에지 추출

17 소벨 에지 추출 소벨 마스크의 특징 모든 방향의 에지 추출 돌출한 화소값을 비교적 평균화하므로 잡음에 대체적으로 강함
수직 수평 방향 에지 보다 대각선 방향 에지에 더 민감하게 반응 6장 공간영역 기반 처리(3) - 에지 추출

18 소벨 에지 추출 소벨 에지 결과 영상 6장 공간영역 기반 처리(3) - 에지 추출

19 소벨 에지 추출 소벨 에지 결과 6장 공간영역 기반 처리(3) - 에지 추출

20 소벨 에지 추출 구현하기 BYTE **CEdge::GS_sobel_edge( BYTE **gray_image, int height, int width, int method ) { int i, j, m, n; int vertical_var, horizontal_var, ret_var; int mask_height, mask_width; CColor cColor; BYTE **edge_image = cColor.GS_alloc2D( height, width ); // 수직/수평 마스크 정의 mask_height = mask_width = 3; int vertical_mask[3][3] = { {-1, 0, 1}, {-2, 0, 2}, {-1, 0, 1}, }; int horizontal_mask[3][3] = { {1, 2, 1}, {0, 0, 0}, {-1, -2, -1}, }; for(i=0; i<height-mask_height; i++) { for(j=0; j<width-mask_width; j++) { // 초기화 vertical_var = horizontal_var = 0; 6장 공간영역 기반 처리(3) - 에지 추출

21 for(m=0; m<mask_height; m++) { for(n=0; n<mask_width; n++) { // vertical edge map vertical_var += gray_image[i+m][j+n]* vertical_mask[m][n]; // horizontal edge map horizontal_var += gray_image[i+m][j+n]* horizontal_mask[m][n]; } vertical_var = abs( vertical_var ); horizontal_var = abs( horizontal_var ); // veritcal + horizontal edge map ret_var = vertical_var + horizontal_var; if( method == 0 ) edge_image[i][j] = vertical_var; else if( method == 1 ) edge_image[i][j] = horizontal_var; else if( method == 2 ) edge_image[i][j] = ret_var; return edge_image; 6장 공간영역 기반 처리(3) - 에지 추출

22 소벨 에지 추출 소벨 마스크의 크기 3x3으로 고정된 것은 아니다. 5x5 소벨 마스크 결과
-1 -1 1 1 1 1 2 1 1 -1 -1 1 1 1 1 2 1 1 -2 -2 2 2 -1 -1 1 1 -1 -1 -2 -1 -1 -1 -1 1 1 -1 -1 -2 -1 -1 수직 마스크 수평 마스크 6장 공간영역 기반 처리(3) - 에지 추출

23 소벨 에지 추출 소벨 에지 결과 6장 공간영역 기반 처리(3) - 에지 추출

24 프리윗 에지 추출 프리윗 마스크 마스크 특징 소벨 마스크를 회선한 결과와 비슷 응답시간이 다소 빠름
소벨 마스크에 비해 밝기 변화에 대해 비중을 약간 적게 준 관계로 에지 추출시 에지가 덜 부각됨 대각선 방향 에지보다 수직/수평 방향 에지 더 민감하게 반응함 -1 1 1 1 1 -1 1 -1 1 -1 -1 -1 수직 마스크 수평 마스크 6장 공간영역 기반 처리(3) - 에지 추출

25 프리윗 에지 추출 프리윗 마스크를 이용한 영상 결과 6장 공간영역 기반 처리(3) - 에지 추출

26 프리윗 에지 추출 구현하기 BYTE **CEdge::GS_prewitt_edge( BYTE **gray_image, int height, int width, int method ) { int i, j, m, n; int vertical_var, horizontal_var, ret_var; int mask_height, mask_width; CColor cColor; BYTE **edge_image = cColor.GS_alloc2D( height, width ); // 수직/수평 마스크 정의 mask_height = mask_width = 3; int vertical_mask[3][3] = { {-1, 0, 1}, {-1, 0, 1}, {-1, 0, 1}, }; int horizontal_mask[3][3] = { {1, 1, 1}, {0, 0, 0}, {-1, -1, -1}, }; for(i=0; i<height-mask_height; i++) { for(j=0; j<width-mask_width; j++) { // 초기화 vertical_var = horizontal_var = 0; 6장 공간영역 기반 처리(3) - 에지 추출

27 for(m=0; m<mask_height; m++) { for(n=0; n<mask_width; n++) { // vertical edge map vertical_var += gray_image[i+m][j+n]* vertical_mask[m][n]; // horizontal edge map horizontal_var += gray_image[i+m][j+n]* horizontal_mask[m][n]; } vertical_var = abs( vertical_var ); horizontal_var = abs( horizontal_var ); ret_var = vertical_var + horizontal_var; if( method == 0 ) edge_image[i][j] = vertical_var; else if( method == 1 ) edge_image[i][j] = horizontal_var; else if( method == 2 ) edge_image[i][j] = ret_var; return edge_image; 6장 공간영역 기반 처리(3) - 에지 추출

28 프리윗 에지 추출 프리윗 마스크와 비슷한 방법 프레이첸 마스크 스터캐스틱 마스크 소벨 마스크의 2대신 2의 제곱근 값을 대입
잡음이 섞인 영상, 평균한 영상, 저주파 통과 필터링 영상 등의 좋은 결과를 얻을 수 이있음 3x3, 5x5, 7x7 의 크기와 snr(signal-to-noise ratio : 신호 대 잡음비)별에 따라 마스크 내의 값이 다름 -0.97 0.97 0.97 1 0.97 -1 1 -0.97 0.97 -0.97 -1 -0.97 6장 공간영역 기반 처리(3) - 에지 추출 수직 마스크 수평 마스크

29 로버츠 에지 추출 로버츠 마스크 로버츠 마스크의 특징 소벨, 프리윗 마스크에 비해 매우 빠른 계산 속도를 나타냄
주변과 관계없이 경계가 확실한 에지를 추출 다른 마스크보다 크기가 작아 돌출한 화소값을 평균화 할수 없는 관계로 잡음 해결이 불가능함 -1 -1 1 1 수직 마스크 수평 마스크 6장 공간영역 기반 처리(3) - 에지 추출

30 로버츠 에지 추출 로버츠 에지 추출의 결과 6장 공간영역 기반 처리(3) - 에지 추출

31 로버츠 에지 추출 구현하기 BYTE **CEdge::GS_roberts_edge( BYTE **gray_image, int height, int width, int method ){ int i, j, m, n; int diagonal_var1, diagonal_var2, ret_var; int mask_height, mask_width; CColor cColor; BYTE **edge_image = cColor.GS_alloc2D( height, width ); // 대각선 마스크 정의 mask_height = mask_width = 3; int diagonal_mask1[3][3] = { {-1, 0, 0}, {0, 1, 0}, {0, 0, 0}, }; int diagonal_mask2[3][3] = { {0, 0, -1}, {0, 1, 0}, {0, 0, 0}, }; for(i=0; i<height-mask_height; i++) { for(j=0; j<width-mask_width; j++) { // 초기화 diagonal_var1 = diagonal_var2 = 0; 6장 공간영역 기반 처리(3) - 에지 추출

32 for(m=0; m<mask_height; m++) { for(n=0; n<mask_width; n++){ // diagonal edge map 1 diagonal_var1 += gray_image[i+m][j+n]*diagonal_mask1[m][n]; // diagonal edge map 2 diagonal_var2 += gray_image[i+m][j+n]*diagonal_mask2[m][n]; } diagonal_var1 = abs( diagonal_var1 ); diagonal_var2 = abs( diagonal_var2 ); ret_var = diagonal_var1 + diagonal_var2; if( method == 0 ) edge_image[i][j] = diagonal_var1; else if( method == 1 ) edge_image[i][j] = diagonal_var2; else if( method == 2 ) edge_image[i][j] = ret_var; return edge_image; 6장 공간영역 기반 처리(3) - 에지 추출

33 컴퍼스 에지 추출 컴퍼스 나침반이라는 기구에서 연상하여 각 8개의 기울기를 구하여 각 기울기의 최대값을 이용해 에지를 추출하는 기법 컴퍼스 마스크의 종류 Prewitt Kirsch Robinson 3 level Robinson 5 level 6장 공간영역 기반 처리(3) - 에지 추출

34 컴퍼스 에지 추출 컴퍼스 마스크 6장 공간영역 기반 처리(3) - 에지 추출

35 컴퍼스 에지 추출 컴퍼스 에지 추출 결과 6장 공간영역 기반 처리(3) - 에지 추출

36 컴퍼스 에지 추출 컴퍼스 에지 추출 결과 6장 공간영역 기반 처리(3) - 에지 추출

37 컴퍼스 에지 추출 구현하기 BYTE **CEdge::GS_compass_edge( BYTE **gray_image, int height, int width, int method ) { int i, j, m, n; int mask_height, mask_width; CColor cColor; BYTE **edge_image = cColor.GS_alloc2D( height, width ); mask_height = mask_width = 3; BYTE **mask = cColor.GS_alloc2D( mask_height, mask_width ); for(i=0; i<height-mask_height; i++) { for(j=0; j<width-mask_width; j++) { for(m=0; m<mask_height; m++) { for(n=0; n<mask_width; n++) { mask[m][n] = gray_image[i+m][j+n]; } 6장 공간영역 기반 처리(3) - 에지 추출

38 edge_image[i][j] = GS_get_compass( mask, method ); } return edge_image; // method 값에 따른 분기 처리 BYTE CEdge::GS_get_compass( BYTE **mask, int method ){ BYTE ret_var = 0; if( method == 0 ) ret_var = GS_get_prewitt_compass( mask ); else if( method == 1 ) ret_var = GS_get_kirsch_compass( mask ); else if( method == 2 ) ret_var = GS_get_robinson3_compass( mask ); else if( method == 3 ) ret_var = GS_get_robinson5_compass( mask ); return ret_var; 6장 공간영역 기반 처리(3) - 에지 추출

39 // prewitt compass BYTE CEdge::GS_get_prewitt_compass( BYTE
// prewitt compass BYTE CEdge::GS_get_prewitt_compass( BYTE **mask ){ int i, j; int ret_var = ; int buf[9] = {0,}; CPixel cPixel; int prewitt_compass_hour1[3][3] = {{1, 1, -1}, {1, -2, -1}, {1, 1, -1}}; int prewitt_compass_hour2[3][3] = {{1, -1,-1}, {1, -2, -1}, {1, 1, -1}}; int prewitt_compass_hour3[3][3] = {{-1, -1, -1}, {1, -2, 1}, {1, 1, 1}}; int prewitt_compass_hour4[3][3] = {{-1, -1, 1}, {-1, -2, 1}, {1, 1, 1}}; int prewitt_compass_hour5[3][3] = {{-1, 1, 1}, {-1, -2, 1}, {-1, 1, 1}}; int prewitt_compass_hour6[3][3] = {{1, 1, 1}, {1, -2, -1}, {-1, -1, 1}}; int prewitt_compass_hour7[3][3] = {{1, 1, 1}, {1, -2, 1}, {-1, -1, -1}}; int prewitt_compass_hour8[3][3] = {{1, 1, 1}, {-1, -2, 1}, {-1, -1, 1}}; for(i=0; i<3; i++) { for(j=0; j<3; j++) { buf[0] += mask[i][j] * prewitt_compass_hour1[i][j]; buf[1] += mask[i][j] * prewitt_compass_hour2[i][j]; buf[2] += mask[i][j] * prewitt_compass_hour3[i][j]; 6장 공간영역 기반 처리(3) - 에지 추출

40 buf[3] += mask[i][j] * prewitt_compass_hour4[i][j];
} // 큰값을 가지는 것을 구한다. for(i=0; i<8; i++) { ret_var = max(ret_var, buf[i]); return cPixel.GS_clamping( ret_var ); 6장 공간영역 기반 처리(3) - 에지 추출

41 2차 미분 2차 미분을 이용하는 방법 1차 미분 값의 크기는 영상에서 에지의 존재 여부를 알기 위해 사용될 수 있는 반면 2차 미분 값의 부호는 에지 화소가 에지의 밝은 부분에 있는지 어두운 부분에 있는지를 결정하는데 사용됨 2차 미분 방식을 이용하여 영상에서 에지를 검출하면 영상에 대해서 미분을 두 번 수행하기 때문에 에지가 중심 방향에 가늘게 형성되며 검출된 윤곽선이 폐곡선을 이루게 됨 2차 미분 연산자의 장점은 검출 된 에지의 윤곽선들이 폐곡선을 이룬다는 것 2차 미분은 밝기 값이 점차적으로 변화되는 영역에 대해서는 반응을 보이지 않는다는 단점 6장 공간영역 기반 처리(3) - 에지 추출

42 2차 미분 라플라시안 연산자 2차 미분 연산자로서 가장 많이 사용하는 알고리즘으로 대표적인 것이 라플라시안(Laplacian), 가우시안-라플라시안(LoG: Laplacian of Gaussian) 알고리즘들이 있다. 2차 미분을 이용한 방법은 기울기를 이용하여 1차 미분 결과를 얻었듯이 라플라시안도 다음과 같이 정의 됨 6장 공간영역 기반 처리(3) - 에지 추출

43 2차 미분 라플라시안 필터링은 위의 식과 같이 수행되며 마스크의 형태로 나타남
2차 미분방식을 이용하여 영상을 처리하게 되면 저주파 성분에 해당하는 값들은 소거가 되는 반면에 고주파 성분들은 더 선명하게 나타나게 된다. 따라서 에지 부분을 강조한 결과가 된다. 6장 공간영역 기반 처리(3) - 에지 추출

44 2차 미분 라플라시안 에지 추출 예제 6장 공간영역 기반 처리(3) - 에지 추출

45 2차 미분 라플라시안 구현하기 BYTE **CEdge::GS_laplacian_sharpening( BYTE **gray_image, int height, int width, int method ){ int i, j, m, n, ret_var; int mask_height, mask_width; CPixel cPixel; CColor cColor; BYTE **result_image = cColor.GS_alloc2D( height, width ); // 라플라시안 마스크 정의 mask_height = mask_width = 3; int mask_four[3][3] = { {0, -1, 0}, {-1, 4, -1}, {0, -1, 0}, }; int mask_eight[3][3] = { {-1, -1, -1}, {-1, 8, -1}, {-1, -1, -1}, }; for(i=0; i<height-mask_height; i++) { for(j=0; j<width-mask_width; j++) { // 초기화 ret_var = 0; 6장 공간영역 기반 처리(3) - 에지 추출

46 for(m=0; m<mask_height; m++) { for(n=0; n<mask_width; n++) {
if( method == 0 ) ret_var += gray_image[i+m][j+n]*mask_four[m][n]; else if( method == 1 ) ret_var += gray_image[i+m][j+n]*mask_eight[m][n]; } result_image[i][j] = cPixel.GS_clamping( gray_image[i][j] + ret_var ); return result_image; 6장 공간영역 기반 처리(3) - 에지 추출

47 LoG 가우시안-라플라시안(LoG: Laplacian of Gaussian) 연산자
라플라시안 연산자가 잡음에 민감하다는 점을 개선한 것이 가우시안-라플라시안 연산자라 함 LoG 에지 검출기는 라플라시안을 적용하기 전에 가우신안 스무딩을 적용 가우시안 스무딩 함수에 기반한 에지 검출 방식이기 때문에 에지 검출은 영상에서 잡음을 줄임 잡음에 의해 잘못 검출되는 에지의 수를 줄이면서 에지 굵기는 더 넓게 만듬 가우시안-라플라시안 함수의 폭이 넓을수록 간격이 넓은 에지가 검출되고 함수의 폭이 좁으면 경사가 급격한 에지와 좀더 세세한 에지만이 검출된다. 가우시안-라플라시안 연산자(LoG : Laplacian of Gaussian function). 6장 공간영역 기반 처리(3) - 에지 추출

48 LoG 6장 공간영역 기반 처리(3) - 에지 추출

49 LoG LoG 에지 추출 예제 6장 공간영역 기반 처리(3) - 에지 추출

50 LoG LoG 구현하기 BYTE **CEdge::GS_LoG_edge( BYTE **gray_image, int height, int width, double sigma, int method ){ int i, j, m, n, ret_var; int mask_height, mask_width; CPixel cPixel; CColor cColor; BYTE **edge_image = cColor.GS_alloc2D( height, width ); // 라플라시안 마스크 정의 int mask_four1[3][3] = { {0, -1, 0}, {-1, 4, -1}, {0, -1, 0}, }; int mask_four2[3][3] = { {0, 1, 0}, {1, -4, 1}, {0, 1, 0}, }; int mask_eight1[3][3] = { {-1, -1, -1}, {-1, 8, -1}, {-1, -1, -1}, }; int mask_eight2[3][3] = { {1, -2, 1}, {-2, 4, -2}, {1, -2, 1}, }; // 가우시안 스무딩 CFilter cFilter; BYTE **gaussian_smoothing_image = cFilter.GS_gaussian_smoothing_filtering(gray_image, height, width, &mask_height, &mask_width, sigma); 6장 공간영역 기반 처리(3) - 에지 추출

51 for(i=0; i<height-mask_height; i++) { for(j=0; j<width-mask_width; j++) { // 초기화 ret_var = 0; for(m=0; m<mask_height; m++) { for(n=0; n<mask_width; n++){ if( method == 0 ) ret_var += gaussian_smoothing_image[i+m][j+n]*mask_four1[m][n]; else if( method == 1 ) ret_var += gaussian_smoothing_image[i+m][j+n]*mask_four2[m][n]; else if( method == 2 ) ret_var += gaussian_smoothing_image[i+m][j+n]*mask_eight1[m][n]; else if( method == 3 ) ret_var += gaussian_smoothing_image[i+m][j+n]*mask_eight2[m][n]; } edge_image[i][j] = (BYTE)ret_var; }} return edge_image; 6장 공간영역 기반 처리(3) - 에지 추출

52 케니 에지 검출 캐니 에지 검출 방법 일반적으로 에지 검출기는 잡음에 매우 민감한 특성을 가지고 있다. 따라서, 잡음으로 인해 잘못된 에지를 계산하는 것을 방지하기 위해 개발 된 알고리즘이 캐니(canny) 에지 검출기이다. 이 알고리즘은 탐지성(good detection), 국부성(good localization), 응답성(clear response)을 만족하는 에지를 찾는 방법을 제시하고 있다. 탐지성 ( good detection) : 실제 모든 에지를 탐지하는 능력 국부성 9 good localization) : 실제 에지와 탐지된 에지의 차이를 최소화 응답성 (clear response) : 각 에지에 대하여 단일한 응답 6장 공간영역 기반 처리(3) - 에지 추출

53 케니 에지 검출 알고리즘 가운시안 스무딩 필터링 X, y 축으로 기울기 계산 기울기의 강도를 계산 Hystersis 수행
6장 공간영역 기반 처리(3) - 에지 추출

54 케니 에지 검출 6장 공간영역 기반 처리(3) - 에지 추출

55 케니 에지 검출 구현하기 BYTE **CEdge::GS_canny_edge( BYTE **gray_image, int height, int width, double sigma, int threshold, int method ){ int i, j; double Gx_sum, Gy_sum, ret_var; int mask_height, mask_width; CPixel cPixel; CColor cColor; CFilter cFilter; BYTE **edge_image = cColor.GS_alloc2D( height, width ); // Gaussian smoothing BYTE **gaussian_smoothing_image = cFilter.GS_gaussian_smoothing_filtering(gray_image, height, width, &mask_height, &mask_width, sigma); // 처리 시간을 줄이기 위해 마스크를 쓰지 않고 직접 곱한다. for(i=0; i<height-mask_height; i++) { for(j=0; j<width-mask_width; j++) { // Sobel if(method == 0) { // 수직 마스크 6장 공간영역 기반 처리(3) - 에지 추출

56 Gx_sum = -gaussian_smoothing_image[i][j] - 2
Gx_sum = -gaussian_smoothing_image[i][j] - 2*gaussian_smoothing_image[i+1][j] - gaussian_smoothing_image[i+2][j] + gaussian_smoothing_image[i][j+2] + 2*gaussian_smoothing_image[i+1][j+2] + gaussian_smoothing_image[i+2][j+2]; // 수평 마스크 Gy_sum = -gaussian_smoothing_image[i][j] - 2*gaussian_smoothing_image[i][j+1] - gaussian_smoothing_image[i][j+2] + gaussian_smoothing_image[i+2][j] + 2*gaussian_smoothing_image[i+2][j+1] } // Prewitt else if(method == 1) { // 수직 마스크 6장 공간영역 기반 처리(3) - 에지 추출

57 Gx_sum = -gaussian_smoothing_image[i][j] - gaussian_smoothing_image[i+1][j] - gaussian_smoothing_image[i+2][j] + gaussian_smoothing_image[i][j+2] + gaussian_smoothing_image[i+1][j+2] + gaussian_smoothing_image[i+2][j+2]; // 수평 마스크 Gy_sum = -gaussian_smoothing_image[i][j] - gaussian_smoothing_image[i][j+1] - gaussian_smoothing_image[i][j+2] + gaussian_smoothing_image[i+2][j] + gaussian_smoothing_image[i+2][j+1] } // Roberts else if(method == 2){ // 대각선 방향 6장 공간영역 기반 처리(3) - 에지 추출

58 Gx_sum = -gaussian_smoothing_image[i][j+2] + gaussian_smoothing_image[i+1][j+1]; // 역대각선 방향 Gy_sum = -gaussian_smoothing_image[i][j] } ret_var = fabs(Gx_sum) + fabs(Gy_sum); // hysteresis 수행// 즉, lower, upper 경계값 처리 하는 것. // 여기서 upper를 255로 정하였다. if(ret_var > 255.0) ret_var = 0.0; else if(ret_var < (double)threshold) ret_var = 0.0; edge_image[i][j] = (BYTE)ret_var; return edge_image; 6장 공간영역 기반 처리(3) - 에지 추출

59 라인 검출 점(point), 선(line) 검출
선 에지 검출 방법은 다음의 마스크와 같이 각 방향을 위한 에지 마스크를 이용해서 해당 방향의 에지를 검출하는 방법. 선 검출 마스크는 수평방향(0도), 수직방향(90도), 대각선 방향(45도, 135도)의 선을 검출 선 에지 검출 마스크: 점 에지 검출 마스크: 6장 공간영역 기반 처리(3) - 에지 추출

60 라인 검출 점, 선 검출 연산을 이용한 에지 검출 기법 예 6장 공간영역 기반 처리(3) - 에지 추출

61 라인 검출 라인 검출 예제 6장 공간영역 기반 처리(3) - 에지 추출

62 라인 검출 구현하기 // line edge // method - 0 : 0도 // - 1 : 45도 // - 2 : 90도
// : 45도 // : 90도 // : 135도 BYTE **CEdge::GS_line_edge( BYTE **gray_image, int height, int width, int method ){ int i, j, m, n, ret_var; int mask_height, mask_width; CPixel cPixel; CColor cColor; BYTE **edge_image = cColor.GS_alloc2D( height, width ); // 라인 에지 마스크 정의 mask_height = mask_width = 3; int mask_0_degree[3][3] = { {-1, -1, -1}, {2, 2, 2}, {-1, -1, -1}, }; int mask_45_degree[3][3] = { {-1, -1, 2}, {-1, 2, -1}, {2, -1, -1}, }; int mask_90_degree[3][3] = { {-1, 2, -1}, {-1, 2, -1}, {-1, 2, -1}, }; int mask_135_degree[3][3] = { {2, -1, -1}, {-1, 2, -1}, {-1, -1, 2},}; 6장 공간영역 기반 처리(3) - 에지 추출

63 for(i=0; i<height-mask_height; i++) { for(j=0; j<width-mask_width; j++) { // 초기화 ret_var = 0; for(m=0; m<mask_height; m++) { for(n=0; n<mask_width; n++){ if( method == 0 ) ret_var += gray_image[i+m][j+n]*mask_0_degree[m][n]; else if( method == 1 ) ret_var += gray_image[i+m][j+n]*mask_45_degree[m][n]; else if( method == 2 ) ret_var += gray_image[i+m][j+n]*mask_90_degree[m][n]; else if( method == 3 ) ret_var += gray_image[i+m][j+n]*mask_135_degree[m][n]; } edge_image[i][j] = cPixel.GS_clamping( ret_var ); }} return edge_image; 6장 공간영역 기반 처리(3) - 에지 추출


Download ppt "6장. 공간 영역 기반처리(3) - 에지 추출 임은경 6장 공간영역 기반 처리(3) - 에지 추출."

Similar presentations


Ads by Google