5장. 공간 영역 기반처리 임은경 5장 공간영역 기반 처리(2).

Slides:



Advertisements
Similar presentations
기본 자료형 순천향대학교 정보기술공학부 이 상 정. 자료형의 선언 컴퓨터프로그래밍 1 순천향대학교 정보기술공학부 이 상 정 3 자료형 선언 기본 자료형문자형 char 정수형 int 실수형 float double 형없음 void.
Advertisements

멘토링 2 주차 장 프로그래밍을 위한 자바의 자료형  값이 변하지 않는 상수  메모리 기억공간인 변수.
일 시 : (목) 장 소 : 문산종합사회복지관장) 파주시문산종합사회복지관 기관안내.
6장. 공간 영역 기반처리(3) - 에지 추출 임은경 6장 공간영역 기반 처리(3) - 에지 추출.
명품 JAVA Programming 제 3 장 반복문, 배열, 예외처리.
Digital Image Processing
프로그래밍1 및 실습 (C언어) - 3장 기본자료형 (3.6부터 끝까지) -
2007 1학기 12 배열.
컴퓨터 개론 및 실습 강의 9.
명품 C++ 프로그래밍 3장. 클래스와 객체.
슬라이드 1~21까지는 각자 복습! 슬라이드 22부터는 수업시간에 복습
C++ Espresso 제3장 배열과 포인터.
C++ Espresso 제3장 배열과 포인터.
쉽게 풀어쓴 C언어 Express 제11장 포인터 C Express.
IntArray[0] int length 5 intArray 객체 제 3 장 반복문, 배열, 예외처리.
어서와 Java는 처음이지! 제4장 배열.
2장. 컬러 공간 분석 임은경 2주차 - 디지털영상처리의개념.
제 4장 문 장 배정문 혼합문 제어문 표준 입출력.
8. 객체와 클래스 (기본).
쉽게 풀어쓴 C언어 Express 제8장 함수 C Express Slide 1 (of 26)
쉽게 풀어쓴 C언어 Express 제18장 입출력과 라이브러리 함수 C Express.
C 11장. 포인터의 활용 #include <stdio.h> int main(void) { int num;
C언어: 배열 (Arrays).
영상 복원 7.1 영상의 열화 모델 7.2 잡음 모델 7.3 공간 영역 필터를 통한 잡음 제거
Choi, Namseok Java 기초 (Java의 제어문과 배열) Choi, Namseok
Sharpening Filter (High-Pass Filter)
Multimedia Programming 11: Point Processing 6
쉽게 풀어쓴 C언어 Express 제17장 동적 메모리와 연결 리스트 C Express.
쉽게 풀어쓴 C언어 Express 제17장 동적메모리와 연결리스트 C Express.
동적메모리와 연결리스트 컴퓨터시뮬레이션학과 2016년 봄학기 담당교수 : 이형원 E304호,
6장 히스토그램 처리 차 례 히스토그램의 개요 히스토그램의 용도 영상 이치화 히스토그램 평활화 히스토그램 스트레칭
C 7장. 배열과 문자열 #include <stdio.h> int main(void) { int num;
7장 배열 배열의 정의 배열의 초기화 1차원 배열 2차원 및 다차원 배열 문자 배열 배열과 구조.
Chapter 06. 선택문.
3장. 화소값기반처리 임은경 3장 - 화소값 기반 처리.
프로그래밍실습 제 16 강.
CHAP 7:트리 C로 쉽게 풀어쓴 자료구조 생능출판사 2005.
쉽게 풀어쓴 C언어 Express 제4장 변수와 자료형 C Express.
개정판 누구나 즐기는 C언어 콘서트 제6장 반복문 출처: pixabay.
목차 INDEX 1. 회원가입 및 로그인 2. 업체정보 3. 제조검사 신청 4. 인보이스 5. 검사진행현황(현장검사 신청)
C언어 프로그래밍의 이해 Ch13. 선행처리기와 주석문.
CHAP 7:트리 C로 쉽게 풀어쓴 자료구조 생능출판사 2005.
11장. 1차원 배열 IT응용시스템공학과 김 형 진 교수.
제2장 제어구조와 배열 if-else 문에 대하여 학습한다. 중첩 if-else 문에 대하여 학습한다.
게임프로그래밍 I - 1차원 배열 - 공주대학교 게임디자인학과 박 찬 교수 2011년 4월 25일.
Chapter 11. 배열과 포인터.
컴퓨터 그래픽 I 영화 홍보 사이트 분석 과목 : 컴퓨터 그래픽 I 담당교수 : 손애경 교수님 학과 : 정보처리과 1반(A1)
Byte Alignment ㈜ 웰컴정보시스템 김 정 은.
JA V A W. 07 Sb.L.
#1 배열 활용 #include int main(void) { int i; int grade[5]; grade[0] = 10; grade[1] = 20; grade[2] = 30; grade[3] = 40; grade[4] = 50; for(i=0;i.
Java 3장. 자바의 기본 구조 I : 변수, 자료형, 연산자 public class SumTest {
6장 반복제어문 for 문 while 문 do while 문 기타 제어문.
Part 06 세상을 변화시키는 연산자 안산1대학 디지털정보통신과 임 성 국.
누구나 즐기는 C언어 콘서트 제2장 기초 사항 IT응용시스템공학과 김형진 교수.
-Part1- 제7장 반복문이란 무엇인가.
03. 메모리 관리 C++ 프로그램에서 다룰 수 있는 메모리의 종류
-Part2- 제2장 다차원 배열이란 무엇인가.
C언어 프로그래밍의 이해 Ch03. 기본 자료형, 변수와 상수.
컴퓨터 프로그래밍 기초 - 11th : 파일 입출력 및 구조체 -
성공적인 입사지원서 작성법 제이비커리어 교육수석 소 은 선.
9주차: Using Files and Others
박성진 컴퓨터 프로그래밍 기초 [03] 변수와 자료형 박성진
개정판 누구나 즐기는 C언어 콘서트 제10장 문자열 출처: pixabay.
책을 읽읍시다  탈향 진지하게 설명해드림 1303 김소희 1309박지호 1315이지수.
C 프로그래밍은 매우 도전적인 작업이다. 도전의 이면에 철저한 준비와 체계적인 노력
Chapter 09. 배열.
2016년 제1차 운영위원회 평택시건강가정 ∙다문화가족지원센터
강의 #3. 순환(Recursion).
11장. 1차원 배열.
Ch.11. 이진영상처리를 이용한 영상인식.
Presentation transcript:

5장. 공간 영역 기반처리 임은경 5장 공간영역 기반 처리(2)

차례 및 목적 차례 잡음 생성 미디언 필터링 혼합 미디언 필터링 평균값 필터링 A-trimmed 평균값 필터링 최소/최대값 필터링 가우시안 스무딩 필터링 적응적 필터링 – MMSE 필터링 잡음 제거 필터링 성능 척도 CxImage에서 제공하는 함수 분석 및 구현하기 5장 공간영역 기반 처리(2)

잡음 생성 잡음 영상의 내부와 외부로부터 입력 영상 신호 성분 이외의 신호 조명 불량이나 카메라 조작 미숙, 오래된 사진을 스캐너로 읽을 경우에 발생 영상의 품질을 떨어뜨림 잡음을 만들어보자. 0~255 범위의 값중 임의의 값을 영상에 추가 5장 공간영역 기반 처리(2)

잡음 잡음의 종류 임펄스(impulse) 잡음 소금 및 후추(salt and pepper) 잡음 균일(uniform) 잡음 가우시안(Gaussian) 잡음 라플라시안(Laplacian) 잡음 Poisson, exponential 잡음 5장 공간영역 기반 처리(2)

잡음 소금 및 후추(Salt and Pepper) 잡음 영상 내에 검은색 또는 흰색 점의 형태로 발생하는 잡음 임펄스 잡음의 하나이다. 임펄스 잡음을 z(i, j)라고 하면 소금 및 후추 잡음은 확률 p에 따라 다음 식과 같이 모델링 될 수 있다. 임펄스 잡음 z(i,j)는 0 또는 255와 같은 고정된 값을 가짐 5장 공간영역 기반 처리(2)

잡음 가우시안 잡음 정규 분포를 갖는 잡음 영상의 픽셀 값으로부터 불규칙적으로 벗어나지만 뚜렷하게 벗어나지 않는 잡음 5장 공간영역 기반 처리(2)

잡음 임펄스 잡음 영상의 픽셀 값과는 뚜렷하게 다른 픽셀 값에 의한 잡음 0, 255와 같은 뚜렷하게 잘못된 밝기 값을 갖는 화소 5장 공간영역 기반 처리(2)

잡음 라플라시안(Laplicaian) 잡음 균일(Uniform) 잡음 5장 공간영역 기반 처리(2)

잡음 예 5장 공간영역 기반 처리(2)

잡음 제거 평균(블러링) 마스크 가우시안 노이즈를 줄이는데 효과적 임펄스 노이즈에는 비효과적 영상의 대비를 약화시킴 가우시안 노이즈는 블러링으로 인해 주변의 화소값을 평균하게 되면, 잡음이 없을 경우의 밝기값과 비슷하게 됨 영상을 구성하는 원 화소들의 밝기는 인접한 경우에 서로 비슷한 성향을 가짐 임펄스 노이즈에는 비효과적 주변의 화소값과는 큰차이가 나는 임펄스 노이즈의 경우 주변의 화소를 평균하더라도 워낙 차이가 큰 임펄스 노이즈에 의해 원래의 밝기값과는 차이가 나게됨 영상의 대비를 약화시킴 5장 공간영역 기반 처리(2)

잡음 제거 적용 예 평균 마스크를 이용한 잡음 제거 결과 가우시안 잡음 제거 결과 임펄스 잡음 제거 결과 5장 공간영역 기반 처리(2)

잡음 제거 중간값 필터링 임펄스 잡음을 제거하기위한 효과적인 방법 경계선을 보존 또는 강화 출력 영상 픽셀값의 정렬 13 15 16 17 18 20 22 255 입력 영상 필터 윈도우 15 16 17 13 255 18 20 22 5장 공간영역 기반 처리(2)

잡음 제거 적용 예 중간값 필터링을 이용한 잡음 제거 결과 가우시안 잡음 제거 결과 임펄스 잡음 제거 결과 5장 공간영역 기반 처리(2)

미디언 필터링 미디언 필터링 마스크의 크기를 지정하여 마스크 내의 영상의 화소값들을 추출한 후, 크기 순서대로 정렬한 다음 중간값을 찾아 출력 화소로 선택함 임펄스 잡음과 같은 극단적인 값을 가지는 잡음 제거에 효과적임 출력 영상 픽셀값의 정렬 13 15 16 17 18 20 22 255 입력 영상 필터 윈도우 15 16 17 13 255 18 20 22 5장 공간영역 기반 처리(2)

미디언 필터링 다양한 형태의 마스크 존재함 C C C 수직마스크 수평마스크 교차형마스크 블록마스크 C C C 십자형마스크 다이아몬드형 마스크 5장 공간영역 기반 처리(2)

미디언 필터링 장점 단점 정렬을 위한 알고리즘이 요구됨 잡음의 크기가 특정 화소에서 강하게 나타나는 경우 효과적으로 이를 제거하는 특성을 가짐 오브젝트 경계면 부분을 보존하여 선명화를 유지함 단점 주변 점들을 정렬하여 중간 값을 선택해야 하기 때문에, 계산 비용이 높다 정렬을 위한 알고리즘이 요구됨 퀵정렬 버블 정렬… 일반적으로 퀵정렬을 사용함  속도가 빠름, 단점은 메모리 할당량이 큼. 5장 공간영역 기반 처리(2)

미디언 필터링 예제(임펄스 잡음  미디언 필터링의 잡음 제거) 5장 공간영역 기반 처리(2)

미디언 필터링 Water painting 효과 알고리즘 원 영상 또는 명암도 영상에서 화소값 60을 더하기 상수 60만큼 더하는 화소값 기반 처리 미디언 필터링을 4~6번까지 반복수행 샤프닝을 수행하기 5장 공간영역 기반 처리(2)

미디언 필터링 Water painting 효과 알고리즘 예제 5장 공간영역 기반 처리(2)

미디언 필터링 구현하기 BYTE **CFilter::GS_median_filtering( BYTE **gray_image, int height, int width, int mask_height, int mask_width){ int i, j, m, n, cnt; CUtil cUtil; CColor cColor; BYTE **result_image = cColor.GS_alloc2D( height, width); BYTE *mask = (BYTE *)calloc( mask_height*mask_width, sizeof(BYTE) ); for(i=0; i<height-mask_height; i++) { for(j=0; j<width-mask_width; j++) { cnt = -1; for(m=0; m<mask_height; m++) { for(n=0; n<mask_width; n++){ mask[++cnt] = gray_image[m+i][n+j]; } 5장 공간영역 기반 처리(2)

미디언 필터링 cUtil.GS_quick_sort( mask, 0, cnt ); result_image[i][j] = mask[ cnt/2 ]; } return result_image; 5장 공간영역 기반 처리(2)

혼합 미디언 필터링 미디언 필터링 혼합 미디언 필터링 중간값을 추출할 경우 최악의 경우에 영상내 직선, 코너 등과 같은 부분이 망가져서, 결국 희미하게 나타나는 경우가 발생 혼합 미디언 필터링 사용함 혼합 미디언 필터링 미디언 필터링에 기반을 두고 잡음 제거 및 경계선 보존까지도 유지하는 알고리즘 혼합 미디언 필터링을 여러 번 수행하면 포스터라이제이션(posterization)과 같은 현상 발생 영상을 단순화시키며 경계선을 또렷하게 하여 회화적 요소를 얻게 됨 5장 공간영역 기반 처리(2)

혼합 미디언 필터링 혼합 미디언 필터링의 5x5 마스크 대각선 그룹 A 역대각선 그룹 B 1, 4, 5, 2, 7 6, 8, 5, 7, 9 1 6 4 8 정렬(sorting) 정렬(sorting) 5 7 2 1, 2, 4, 5, 7 5, 6, 7, 8, 9 9 7 중간부분 4를 선택 중각부분 7을 선택 해당 마스크의 중심값 5를 구하기 역대각선 그룹 B 대각선 그룹 A 4, 7, 5 5장 공간영역 기반 처리(2)

혼합 미디언 필터링 4, 7, 5 정렬 (sorting) 4, 5, 7 중간값 5를 선택 출력 영상의 화소에 삽입하기 5장 공간영역 기반 처리(2)

혼합 미디언 필터링 예제 (임펄스 잡음  혼합 미디언 필터링 잡음 제거 ) 5장 공간영역 기반 처리(2)

혼합 미디언 필터링 구현하기 BYTE **CFilter::GS_hybrid_median_filtering( BYTE **gray_image, int height, int width, int mask_height, int mask_width) { int i, j, m, n, cnt1, cnt2; BYTE tmp_var[3]; CUtil cUtil; CColor cColor; BYTE **result_image = cColor.GS_alloc2D( height, width); BYTE **mask = cColor.GS_alloc2D( mask_height, mask_width); int buf_length = mask_height; BYTE *buf1 = (BYTE *)calloc( buf_length, sizeof(BYTE) ); BYTE *buf2 = (BYTE *)calloc( buf_length, sizeof(BYTE) ); for(i=0; i<height-mask_height; i++) { for(j=0; j<width-mask_width; j++) { 5장 공간영역 기반 처리(2)

for(m=0; m<mask_height; m++) { for(n=0; n<mask_width; n++){ mask[m][n] = gray_image[m+i][n+j]; } cnt1 = cnt2 = -1; // 대각선, 역 대각선 그룹을 추출한다. if( m == n ) // 대각선 buf1[++cnt1] = mask[m][n]; else if( (m + n) == (buf_length -1) ) // 역 대각선 buf2[++cnt2] = mask[m][n]; // 정렬 cUtil.GS_quick_sort( buf1, 0, cnt1 ); cUtil.GS_quick_sort( buf2, 0, cnt2 ); 5장 공간영역 기반 처리(2)

tmp_var[0] = buf1[ cnt1/2 ]; tmp_var[1] = buf2[ cnt2/2 ]; tmp_var[2] = mask[ mask_height/2 ][ mask_width/2 ]; // 정렬 cUtil.GS_quick_sort( tmp_var, 0, 2 ); result_image[i][j] = tmp_var[1]; } // 할당한 메모리 해제 cColor.GS_free2D( mask, mask_height ); return result_image; 5장 공간영역 기반 처리(2)

평균값 필터링 평균값 필터링(mean filtering) 영상 내 잡음이 전반적으로 분포되어 있을때 사용되는 알고리즘 마스크 내에 화소들의 값을 평균화하여 출력 영상으로 출력하는 알고리즘 미디언 필터링처럼 정렬 수행시간이 필요없기 때문에 수행속도가 빠름 5장 공간영역 기반 처리(2)

평균값 필터링 평균값 필터링 알고리즘 1 2 3 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 4 5 6 7 8 45 / 9 = 5 평균값 5를 얻는다. 출력 영상의 화소에 삽입 5장 공간영역 기반 처리(2)

평균값 필터링 예제 (가우시안 잡음 생성  평균값 잡음 제거) 5장 공간영역 기반 처리(2)

평균값 필터링 구현하기 BYTE **CFilter::GS_mean_filtering( BYTE **gray_image, int height, int width, int mask_height, int mask_width){ int i, j, m, n; CPixel cPixel; CColor cColor; double sum = 0.0, ave_var; BYTE **result_image = cColor.GS_alloc2D( height, width); 5장 공간영역 기반 처리(2)

for(i=0; i<height-mask_height; i++){ for(j=0; j<width-mask_width; j++) { sum = 0.0; for(m=0; m<mask_height; m++){ for(n=0; n<mask_width; n++) { sum += (double)gray_image[m+i][n+j]; } // 평균값을 구한다. ave_var = sum/(mask_height*mask_width); result_image[i][j] = cPixel.GS_clamping( ave_var ); return result_image; 5장 공간영역 기반 처리(2)

а-Trimmed 평균값 필터링 방식 а-Trimmed 평균값 필터링 미디언 필터링과 평균값 필터링의 장점만을 갖춘 알고리즘 a = 0.5 : 미디언 필터링 처럼 수행 a = 0.0 : 평균값 필터링 처럼 수행 5장 공간영역 기반 처리(2)

а-Trimmed 평균값 필터링 방식 а-Trimmed 평균값 필터링 방식 5장 공간영역 기반 처리(2)

а-Trimmed 평균값 필터링 방식 예제(가우시안 잡음  a-trimmed 평균값 잡음 제거) 5장 공간영역 기반 처리(2)

а-Trimmed 평균값 필터링 방식 구현하기 BYTE **CFilter::GS_alpha_trim_mean_filtering( BYTE **gray_image, int height, int width, int mask_height, int mask_width, double alpha) { int i, j, m, n, index, cnt=-1; double var, tmp_var, sum = 0.0; CPixel cPixel; CColor cColor; CUtil cUtil; // alpha 범위를 충족하지 않을 때 if( alpha < 0.0 || alpha > 0.5 ){ GS_errMsg("alpha 값 범위는 0.0 ~ 0.5 입니다."); return NULL; } BYTE **result_image = cColor.GS_alloc2D( height, width); int mask_length = mask_height*mask_width; BYTE *mask = (BYTE *)calloc( mask_length, sizeof(BYTE) ); 5장 공간영역 기반 처리(2)

for(i=0; i<height-mask_height; i++) { for(j=0; j<width-mask_width; j++) { cnt = -1; sum = 0.0; for(m=0; m<mask_height; m++) { for(n=0; n<mask_width; n++){ mask[++cnt]= gray_image[m+i][n+j]; } cUtil.GS_quick_sort( mask, 0, cnt ); tmp_var = alpha * mask_length; // 소수점 절삭 : alpha-trimmed 평균값을 수행하기 위한 위치를 얻기 index = (int)tmp_var; for(m=index; m<mask_length - index; m++) sum += mask[m]; 5장 공간영역 기반 처리(2)

var = sum /(mask_length - 2. index); result_image[i][j] = cPixel var = sum /(mask_length - 2.0*index); result_image[i][j] = cPixel.GS_clamping( var ); } return result_image; 5장 공간영역 기반 처리(2)

최대/최소값 필터링 최대/최소값 필터링 극단적인 값을 제거하기 위해 사용하는 필터링 기법의 일종 최대값 필터링 최소값 필터링 최대값을 통과시키며 최소값(폭탄)을 제거시키는 기법 마스크 내에서 최대값을 출력으로 반영함 최소값 필터링 최소값은 통과시키고 최대값을 제거시키는 방법 높은 대조를 가진 영상에서 특징을 확대시키기 위해 사용되는 기법으로 사용됨 마스크 내에서 최소값을 출력으로 반영함 의료영상 분야에서 빈번하게 사용됨 5장 공간영역 기반 처리(2)

최대/최소값 필터링 예제 5장 공간영역 기반 처리(2)

최대/최소값 필터링 열림/ 닫힘 필터링 최대/최소값 필터링을 응용한 알고리즘 열림 필터링 닫힘 필터링 최대값 필터링을 수행한 후 최소값 필터링 수행하는 것 닫힘 필터링 최소값 필터링을 수행한 후 최대값 필터링을 수행하는 것 5장 공간영역 기반 처리(2)

최대/최소값 필터링 예제 5장 공간영역 기반 처리(2)

최대값 필터링 구현하기 BYTE **CFilter::GS_maximum_filtering( BYTE **gray_image, int height, int width, int mask_height, int mask_width) { int i, j, m, n, cnt=-1; CColor cColor; CUtil cUtil; BYTE **result_image = cColor.GS_alloc2D( height, width); int mask_length = mask_height*mask_width; BYTE *mask = (BYTE *)calloc( mask_length, sizeof(BYTE) ); for(i=0; i<height-mask_height; i++) { for(j=0; j<width-mask_width; j++) { 5장 공간영역 기반 처리(2)

cnt = -1; for(m=0; m<mask_height; m++) { for(n=0; n<mask_width; n++) { mask[++cnt]= gray_image[m+i][n+j]; } // 정렬 cUtil.GS_quick_sort( mask, 0, cnt ); // 최소값을 구한다. result_image[i][j] = mask[cnt]; return result_image; 5장 공간영역 기반 처리(2)

최소값 필터링 구현하기 BYTE **CFilter::GS_minimum_filtering( BYTE **gray_image, int height, int width, int mask_height, int mask_width) { int i, j, m, n, cnt=-1; CColor cColor; CUtil cUtil; BYTE **result_image = cColor.GS_alloc2D( height, width); int mask_length = mask_height*mask_width; BYTE *mask = (BYTE *)calloc( mask_length, sizeof(BYTE) ); for(i=0; i<height-mask_height; i++) { for(j=0; j<width-mask_width; j++) { cnt = -1; 5장 공간영역 기반 처리(2)

for(m=0; m<mask_height; m++) { for(n=0; n<mask_width; n++){ mask[++cnt]= gray_image[m+i][n+j]; } // 정렬 cUtil.GS_quick_sort( mask, 0, cnt ); // 최소값을 구한다. result_image[i][j] = mask[0]; return result_image; 5장 공간영역 기반 처리(2)

가우시안 스무딩 필터링 가우시안 Karl Friedrich Gass(1777-1885)가 제안한 가우시안 분포는 모든 과학 분야에서 가장 보편적이며, 실험 오차 측정 등에 많이 쓰여지는 분포 가우시안 필터 평균이 0인 가우시안 정규 분포를 이용하여 필터링을 수행 2차원 멀어질수록 적은 가중치를 줌가우시안 분포의 일반적인 특성으로는 순환 대칭적이라는 특성을 가지며, 중앙에 단일의 돌출 부분을 가짐 중앙에 위치한 화소를 중심으로 이웃한 좌우측 지점으로 5장 공간영역 기반 처리(2)

가우시안 스무딩 필터링 가우시안 마스크 (5x5) 순환 대칭하여 중앙이 큰 값 을 가지고, 주변이 점점 작은 값을 가짐 순환 대칭하여 중앙이 큰 값 을 가지고, 주변이 점점 작은 값을 가짐 가우시안 분포의 모양을 잘 반영하고 있음 원형으로 값이 줄어듬 5장 공간영역 기반 처리(2)

가우시안 스무딩 필터링 예제 5장 공간영역 기반 처리(2)

가우시안 스무딩 필터링 구현하기 BYTE **CFilter::GS_gaussian_smoothing_filtering( BYTE **gray_image, int height, int width, int *mask_height, int *mask_width, double sigma) { int i, j; CColor cColor; CUtil cUtil; // sigma 범위를 충족하지 않을 때 if( sigma < 0.0 ) { GS_errMsg("sigma 값은 0 이상이어야 합니다."); return NULL; } // 마스크를 구한다. gaussian 마스크의 크기를 결정한다. // length = 7 이면 2D의 경우 7x7 마스크이다. int length = (int)(6*sigma) + 1; int center = length/2; *mask_height = *mask_width = length; double **mask = cColor.GS_doubleAlloc2D( *mask_height, *mask_width ); double M_PI = 3.141592654; 5장 공간영역 기반 처리(2)

for(i=0; i<. mask_height; i++){ for(j=0; j< for(i=0; i<*mask_height; i++){ for(j=0; j<*mask_width; j++){ mask[i][j] = (1.0/(2.0*M_PI*sigma*sigma)) * exp(-((i-center)*(i-center)+(j-center)*(j-center))* (1.0/(2.0*sigma*sigma))); } // 회선한다. BYTE **result_image = cUtil.GS_conv2( gray_image, height, width, mask, *mask_height, *mask_width ); // 할당한 메모리 해제 cColor.GS_free2D( mask, *mask_height ); return result_image; 5장 공간영역 기반 처리(2)

적응적 필터링 – MMSE 필터링 MMSE(Minimal Mean Square Error) 최소 평균 제곱 오차 필터링 잡음 제거를 위해 경계선이 흐리게 되는 것을 감수해야 하는 평균값 필터링의 단점을 보완함 에지를 보존하는 동시에 에지들의 주변에 있는 잡음 제거 5장 공간영역 기반 처리(2)

적응적 필터링 – MMSE 필터링 예제(가우시안 잡음  3X3, 5X5, 7X7마스크 잡음 제거) 5장 공간영역 기반 처리(2)

적응적 필터링 – MMSE 필터링 구현하기 BYTE **CFilter::GS_MMSE_filtering( BYTE **gray_image, int height, int width,int mask_height, int mask_width, double noise_var) { int i, j, m, n, cnt; double ave, sum, var, ratio; CColor cColor; CPixel cPixel; if( noise_var < 0.0 ){// noise_var 범위를 충족하지 않을 때 GS_errMsg("noise_var 값은 0 이상이어야 합니다."); return NULL; } BYTE **result_image = cColor.GS_alloc2D( height, width); int mask_length = mask_height*mask_width; BYTE *mask = (BYTE *)calloc( mask_length, sizeof(BYTE) ); for(i=0; i<height-mask_height; i++) { for(j=0; j<width-mask_width; j++) { 5장 공간영역 기반 처리(2)

for(m=0; m<mask_height; m++) { for(n=0; n<mask_width; n++) { cnt = -1; sum = 0.0; for(m=0; m<mask_height; m++) { for(n=0; n<mask_width; n++) { mask[++cnt]= gray_image[m+i][n+j]; sum += (double) gray_image[m+i][n+j]; } ave = sum / mask_length; // 평균값을 구한다. sum = 0.0; for(m=0; m<mask_length; m++) // 분산값을 구한다. sum += pow(mask[m] - ave, 2); var = sum / mask_length; ratio = noise_var / var; if( ratio > 1.0 ) var = ave; else var = (1.0 - ratio)*mask[mask_length/2] + ratio*ave; result_image[i][j] = cPixel.GS_clamping( var ); return result_image; 5장 공간영역 기반 처리(2)