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)