'opencv'에 해당되는 글 2건

  1. 2015.11.10 Gaussian smoothing filtering
  2. 2014.04.04 opencv 설치 - visual studio 1

Gaussian smoothing filtering

opencv 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

 

 

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

'opencv' 카테고리의 다른 글

opencv 설치 - visual studio  (1) 2014.04.04
Posted by bogus919
,

Visual Studio 2010에 OpenCV 2.4.8버전을 설치해 보겠다. Visual 6.0 + OpenCV 1.0 버전부터 Visual Studio2012까지 OpenCV를 설치해 보았지만 OpenCV를 설치하는 일이란 참 귀찮다.. 이번엔 Visual Studio 2010에 설치를 할텐데, Visual Studio 2012에 설치하는 방법이랑 별 다른 차이는 없을듯 하다.

1. OpenCV 다운받기

다운받으러 가기

설치하기 위해 OpenCV 최신버전을 받는다. 현재(2014.1.5) 최신버전은 2.4.8버전이다.

다운받은후 실행하여 압축을 해제한다. 난 C드라이브에 압축해제 하였다. 알아서 opencv라는 폴더가 생성이 될 것이다.



2. 환경변수 설정

내컴퓨터 - 속성 - 고급 시스템 설정 - 환경변수 - 시스템변수 - Path - 편집

이전 환경변수를 ;(세미콜론)으로 구분지어주고 
(Opencv설치폴더)\build\x86\vc10\bin; 입력 후 확인

ex) C:\opencv\build\x86\vc10;bin;

Visual Studio 2010 의 경우 vc10
Visual Studio 2008 의 경우 vc9 를 선택하면 된다.

x86은 32bit 
x64는 64bit 환경이다.

재부팅을 해야 환경변수가 적용이 된다. 재부팅을 하고 계속 진행을 하자


3. 속성 설정

Visual Studio 2010 실행 후 Win32 콘솔 응용 프로그램으로 프로젝트를 생성한다. 


빈 프로젝트로 생성한다.


프로젝트 생성후 속성 관리자에서 새 프로젝트 속성 시트를 추가한다.
Debug|Win32 - 마우스 오른쪽 클릭 - 새 프로젝트 속성 시트 추가


OpenCV_Debug로 생성된 속성을 열어 수정한다.
OpenCV_Debug - 마우스 오른쪽 클릭 - 속성

공용 속성 - C/C++ - 일반 - 추가 포함 디렉터리를 추가한다.
(OpenCV 설치 폴더)\build\include

ex) C:\opencv\build\include

공용 속성 - 링커 - 일반 - 추가 라이브러리 디렉터리를 추가한다.
(OpenCV 설치 폴더)\build\x86\vb10\lib

ex) C:\opencv\build\x86\vc10\lib

공용 속성 - 링커 - 입력 - 추가 종속성 을 추가한다.
필요한 것들만 추가해도 된다. 하나를 추가 할 때 마다 ;(세미콜론)으로 구분지어 줘야한다.

opencv_calib3d248d.lib
opencv_contrib248d.lib
opencv_core248d.lib
opencv_features2d248d.lib
opencv_flann248d.lib
opencv_gpu248d.lib
opencv_highgui248d.lib
opencv_imgproc248d.lib
opencv_legacy248d.lib
opencv_ml248d.lib
opencv_nonfree248d.lib
opencv_objdetect248d.lib
opencv_ocl248d.lib
opencv_photo248d.lib
opencv_stitching248d.lib
opencv_superres248d.lib
opencv_ts248d.lib
opencv_video248d.lib
opencv_videostab248d.lib

(추가 해주는 이름뒤에 숫자는(248) 2.4.8 버전 이라는 뜻이므로 다른 버전을 설치한다면 숫자를 바꿔줘야한다.
또한 Debug모드이기 때문에 맨 뒤에 d가 들어가는데 Release모드라면 d를 빼고 입력해주면 된다.)


4. 테스트 하기

모든 설정이 끝났기 때문에 테스트를 해보겠다. 소스파일을 하나 생성한다. 

소스 파일 생성후 다음과 같은 코드를 입력한다.

1
2
3
4
5
6
7
8
9
10
11
#include <opencv\cv.h>
#include <opencv\highgui.h>
 
int main() {
    IplImage *image = cvLoadImage("test.jpg");
 
    cvShowImage("Test",image);
    cvWaitKey(0);
 
    cvReleaseImage(&image);
}

출력할 이미지인 test.jpg 파일을 프로젝트 폴더안에 넣어두고 실행을 한다.
test.jpg의 이미지가 나온다면 힘겨웠던 opencv 설치가 완료된것이다.^^

앞으로 새로운 프로젝트를 생성했을시 지금 만들었던 속성을 불러와서 사용하면 된다.

힘겨운 Open CV 설치 과정이 끝났다. 잘 따라했는데 에러가 난다면 오타가 있거나 중간에 틀린 부분이 있을것이다.

그러나 잘 따라 했다고 해도 에러가 나는 경우가 있다 64비트 컴퓨터에 그러한 경우가 발생할 텐데 아래 글을 읽고 해결하도록 하자.

'opencv' 카테고리의 다른 글

Gaussian smoothing filtering  (0) 2015.11.10
Posted by bogus919
,