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

Slides:



Advertisements
Similar presentations
6 장. printf 와 scanf 함수에 대한 고찰 printf 함수 이야기 printf 는 문자열을 출력하는 함수이다. – 예제 printf1.c 참조 printf 는 특수 문자 출력이 가능하다. 특수 문자의 미 \a 경고음 소리 발생 \b 백스페이스 (backspace)
Advertisements

1. 도형의 연결 상태 2. 꼭지점과 변으로 이루어진 도형 Ⅷ. 도형의 관찰 도형의 연결상태 연결상태가 같은 도형 단일폐곡선의 성질 연결상태가 같은 입체도형 뫼비우스의 띠.
중원대학교 의료공학과 신 진솔 (WED). 영상의 밝기 & 명암 조절 영상의 감마보정 영상의 잡음 감소.
재료수치해석 HW # 박재혁.
화소 영역 처리의 개념 회선 처리의 원리 블러링 샤프닝 요약 연습문제
적분방법의 연속방정식으로부터 Q=AV 방정식을 도출하라.
색좌표 변환기의 설계 예 색좌표(Color Space) 색의 수학적인 표현 방법 RGB YIQ, YUV, YCbCr CMYK
제2장 주파수 영역에서의 모델링.
신호처리 실험 (Signal Processing Lab)
(Numerical Analysis of Nonlinear Equation)
제 9 장 구조체와 공용체.
수치해석 6장 예제문제 환경공학과 천대길.
Report #2 - Solution 문제 #1: 다음과 같이 프로그램을 작성하라.
10장 랜덤 디지털 신호처리 1.
07장 영역 처리를 이용한 에지 검출 ㅎㅎ 에지 검출의 개요 에지 검출기 1차 미분을 이용한 에지 검출
06장 ㅎㅎ 화소 영역 처리 화소 영역 처리의 개념 회선 처리의 원리 블러링 샤프닝 한빛미디어(주)
전자기적인 Impedance, 유전율, 유전 손실
강원대학교 지구물리학과 이훈열 참고: PG Steamer User’s Guide
11장. 포인터 01_ 포인터의 기본 02_ 포인터와 Const.
Multimedia Programming 10: Point Processing 5
멀티미디어 시스템 (아날로그 이미지,신호를 디지털로 변환 방법) 이름 : 김대진 학번 :
3장. 화소값기반처리 임은경 3장 - 화소값 기반 처리.
6장. printf와 scanf 함수에 대한 고찰
5장. 공간 영역 기반처리 임은경 5장 공간영역 기반 처리(2).
Multimedia Programming 06: Point Processing 2
상관함수 correlation function
색의 인식 ~ 빛(light): 전자기파(electromagnetic wave)
11장. 1차원 배열.
7 영역처리를 이용한 에지 검출 01 에지 검출의 개요 02 에지 검출기 03 1차 미분을 이용한 에지 검출
제4장 제어 시스템의 성능.
Ⅲ. 이 차 방 정 식 1. 이차방정식과 그 풀이 2. 근 의 공 식.
Chapter03 캔버스(1) HTML5 Programming.
군집 분석.
Quiz #7 다음 수들을 합병 정렬과 퀵 정렬 알고리즘을 이용하여 오름 차순으로 정렬하였을 때, 데이터 이동 회수를 각각 구하라. 여러분은 정렬 과정을 단계별로 보이면서 이동 회수를 추적해야 한다. 단, 퀵 정렬시에 피봇으로 배열의 왼쪽 첫 번째 원소를 선택한다. 5.
Term Projects 다음에 주어진 2개중에서 한 개를 선택하여 문제를 해결하시오. 기한: 중간 보고서: 5/30 (5)
Computer vision 정보과학부 최영준.
Metal Forming CAE Lab., Gyeongsang National University
컴퓨터 프로그래밍 기초 - 10th : 포인터 및 구조체 -
2장. 변수와 타입.
두 모집단에 대한 검정.
P 등속 직선 운동 생각열기 – 자동차를 타고 고속도로를 달릴 때, 속력계 바늘이 일정한 눈금을 가리키며 움직이지 않을 때가 있다. 이 때 자동차의 속력은 어떠할까? ( 속력이 일정하다 .)
컴퓨터 프로그래밍 기초 - 8th : 함수와 변수 / 배열 -
미분방정식.
수학10-나 1학년 2학기 Ⅱ.부등식의 영역 2. 연립부등식의 영역 (3/5) 부등식 영역 수업계획 수업활동.
수학10-나 1학년 2학기 Ⅱ.부등식의 영역 1. 부등식의 영역(2/5) 부등식 영역 수업계획 수업활동.
Window, Viewport Window, Viewport.
2장 변형률 변형률: 물체의 변형을 설명하고 나타내는 물리량 응력: 물체내의 내력을 설명하고 나타냄
4장. 데이터 표현 방식의 이해. 4장. 데이터 표현 방식의 이해 4-1 컴퓨터의 데이터 표현 진법에 대한 이해 n 진수 표현 방식 : n개의 문자를 이용해서 데이터를 표현 그림 4-1.
Chapter 1 단위, 물리량, 벡터.
제 5장 제어 시스템의 성능 피드백 제어 시스템 과도 성능 (Transient Performance)
영상처리 실습 (OpenCV + MFC) Chonbuk National University A.I. Lab.
Chapter 1 단위, 물리량, 벡터.
7주차: Functions and Arrays
1. 접선의 방정식 2010년 설악산.
쉽게 배우는 알고리즘 2장. 점화식과 점근적 복잡도 분석
7장 원운동과 중력의 법칙.
Chapter 7 – Curves Part - I
상관계수.
수치해석 (Numerical Analysis)
컴퓨터공학과 손민정 Computer Graphics Lab 이승용 교수님
통계학 R을 이용한 분석 제 2 장 자료의 정리.
2장. 페인트샵을 이용한 영상처리 맛보기 신라대학교 임은경 2주차 - 페인트샵을 이용한 영상처리 맛보기.
수치해석 ch3 환경공학과 김지숙.
9장. spss statistics 20의 데이터 변수계산
영역 기반 처리.
수학10-나 1학년 2학기 Ⅱ.부등식의 영역 3. 부등식의 영역에서 최대, 최소(5/5) 부등식 영역 수업계획 수업활동.
컴퓨터는 어떻게 덧셈, 뺄셈을 할까? 2011년 10월 5일 정동욱.
교착 상태 해결 : 교착 상태 탐지 교착 상태 탐지(Deadlock Detection)
: 3차원에서 입자의 운동 방정식 제일 간단한 경우는 위치만의 함수 : 시간, 위치, 위치의 시간미분 의 함수
7 생성자 함수.
Presentation transcript:

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

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

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

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

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

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

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

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

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

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

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

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) - 에지 추출

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) - 에지 추출

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

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

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

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

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

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

소벨 에지 추출 구현하기 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) - 에지 추출

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) - 에지 추출

소벨 에지 추출 소벨 마스크의 크기 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) - 에지 추출

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

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

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

프리윗 에지 추출 구현하기 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) - 에지 추출

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) - 에지 추출

프리윗 에지 추출 프리윗 마스크와 비슷한 방법 프레이첸 마스크 스터캐스틱 마스크 소벨 마스크의 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) - 에지 추출 수직 마스크 수평 마스크

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

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

로버츠 에지 추출 구현하기 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) - 에지 추출

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) - 에지 추출

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

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

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

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

컴퍼스 에지 추출 구현하기 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) - 에지 추출

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) - 에지 추출

// 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 = -99999; 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) - 에지 추출

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) - 에지 추출

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

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

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

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

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) - 에지 추출

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) - 에지 추출

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

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

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

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) - 에지 추출

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) - 에지 추출

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

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

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

케니 에지 검출 구현하기 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) - 에지 추출

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) - 에지 추출

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) - 에지 추출

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) - 에지 추출

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

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

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

라인 검출 구현하기 // line edge // method - 0 : 0도 // - 1 : 45도 // - 2 : 90도 // - 1 : 45도 // - 2 : 90도 // - 3 : 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) - 에지 추출

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) - 에지 추출