opencv

Gaussian smoothing filtering

bogus919 2015. 11. 10. 22:08

영상의

마스크 기반 처리에서 가우시안 스무딩 필터링(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.RAW result.raw

 

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

 

 

 HISTO-COUPLE256X256.RAW result_HISTO-COUPLE256X256.raw

 

 

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