Computer Vision

가우시안 스무딩(gaussian smoothing)

익플루 2014. 6. 12. 15:56
반응형

영상의

마스크 기반 처리에서 가우시안 스무딩 필터링(Gaussian smoothing filtering)에
대해 알아보자.

 

 

* 스무딩(smoothing)은 잡음제거에 많이 쓰인다.

그중의 가우시안 스무딩 필터링에서

 

가우시안 분포란

       - 모든 과학분야에서 가장 보편적인 분포
      - 실험오차 측정 등에 많이 쓰이는 분포
       - 정규분포 공식에서 평균값을 0으로 하여 유도한 분포

 

가우시안 스무딩 필터링 이란?
       - 가우시안 분포를 영상처리에 적용한 것
       - 정규분포, 확률분포에 의해 생성된 잡음을 제거하기 위한 필터
          (랜덤하게 분포된 영상의 잡음을 분석해보면 가우시안 분포를 보인다.)

 

가우시안 분포 함수의 특성
       •  2차원 가우시안 분포 함수는 순환대칭(rotationally symmetric) 특징
           → 마스크로 회선한 smooting 한 결과는 방향이 같다.
       • 가우시안 분포 함수는 단일 돌출(Single peak) 부분을 가진다.          
           →  중앙에 위치한 화소와 먼 거리에 있는 이웃 화소값들을 가중치로  
                 감소시켜, 가중한 이웃의 평균값으로 대치하는 특징을 가짐
       • 가우시안 분포 함수의 퓨리에 변환은 빈번한 스펙트럼상에 단일 돌출
          부분을 가진다.
           → 가우시안 퓨리에 변환 자체가 가우시안 분포이다.
           → 이를 응용한 사례가 가우시안 블러링이다
           → 공간 및 주파수 영역에 가우시안 분포 함수 적용 가능
        • 스무딩 정도인 가우시안 분포 마스크의 폭은 표준편차 σ가 파라메터로 작동하며,  
          표준편차 간 의 관계와 스무딩 정도는 매우 밀접하다.
           → 표준편차 σ가 클수록 더 큰 스무딩 효과를 가진다.

 

 

1차원 가우시안 분포(왼쪽) ->  평균값 : 0, 표준편차 : 1
2차원 가우시안 분포(오른쪽) -> 평균값 : (0,0), 표준편차 : 1

 

표준편차 0.4 이면 3x3 마스크의 크기를 가지며, 0.8이면 5x5 마스크의 크기를 가진다.

따라서 표준편차 가 가우시안 분포의 폭을 결정한다.

 

가우시안 분포를 좀 알았다면 이제 영상에 적용해보자

여기서 우리는 3x3 마스크를 사용할 것이다.

3x3 가우시안 커널은

1/16

1/8

1/16

1/8

1/4

1/8

1/16

1/8

1/16

이 마스크는

1

2

1

2

4

2

1

2

1

 

이제 가우시안 스무딩을 해보자!!

 


#include <math.h>
#include <windows.h>
#include <stdio.h>
using namespace std;


int main()
{
 
 int height= 256;
 int width=256;
 int i,j,vmax,vmin;
 int m_HistoArr[256];
 unsigned char InImg[256][256];
 unsigned char OrgImg[256][256];
 

 FILE *infile= fopen("HISTO-COUPLE256X256.raw","rb");
 if(infile==NULL){printf("error!");return 0;}
 fread(InImg, sizeof(char),256*256,infile);
 fclose(infile);
  

 

 int MaskGaussian[3][3]={{1,2,1},
                                   {2,4,2},
                                   {1,2,1}};
 int heightm1=height-1;//중복계산을 피하려고
 int widthm1=width-1;//중복계산을 피하려고
 int mr,mc;
 int newValue;
 
 //결과 이미지 0으로 초기화
 for(i=0;i<height;i++)
  for(j=0;j<width;j++)
   OrgImg[i][j]=0;

 for(i=1; i<heightm1; i++)
 {
  for(j=1; j<widthm1; j++)
  {
   newValue=0; //0으로 초기화
   for(mr=0;mr<3;mr++)
    for(mc=0;mc<3;mc++)
     newValue += (MaskGaussian[mr][mc]*InImg[i+mr-1][j+mc-1]);
   newValue /= 20; //마스크의 합의 크기로 나누기:값의 범위를 0에서 255로 함
   OrgImg[i][j]=(BYTE)newValue;//BYTE값으로 변환
  }
 }

 FILE *outfile = fopen("result_HISTO-COUPLE256X256.raw","wb");
 fwrite(OrgImg,sizeof(char),256*256,outfile);
 fclose(outfile);
 

 return 0;
}

 

 

다음은 가우시안 필터를 사용한 스무딩을 한 이미지이다.

 

                                             AVE256.RAWresult.raw

 

원래 이미지(왼쪽) 적용된 이미지(오른쪽)

 

 

HISTO-COUPLE256X256.RAWresult_HISTO-COUPLE256X256.raw

 

 

 원래 이미지(왼쪽) 적용된 이미지(오른쪽)

 

 

 

 

 

 

 

반응형