05-11 20:49
Notice
Recent Posts
Recent Comments
관리 메뉴

Scientific Computing & Data Science

[OpenCV] Gaussian Blur 본문

Programming/OpenCV

[OpenCV] Gaussian Blur

cinema4dr12 2015. 7. 18. 23:58

Gaussian Blur는 Gaussian Function을 이용하여 이미지를 블러링하는 기법입니다. Gaussian Function으로부터 계산된 Mask를 통해 각 픽셀에 대한 주변의 픽셀 집합과 회선처리(Convolution)하여 새로운 픽셀값으로 저장합니다. 이 때, 각 코너 및 엣지(Edge)의 픽셀에 대하여서는 회선처리를 할 수 있는 충부한 Element들이 확보되지 않으므로, 엣지를 동일하게 복사하거나 확보되는 element들에 대해서만 회선처리를 할 수 있습니다. 회선처리를 위한 Gaussian Function은 다음과 같습니다:


\( G(x,y) = \displaystyle{ \frac{1}{2 \pi \sigma^2} e^{- \displaystyle{ \frac{x^2 + y^2}{2 \sigma^2} }} } \)


Mask의 행렬 크기는 1, 3, 5, ... 등의 홀수 크기로 자유롭게 정할 수 있는데, 크기 3인 Mask 행렬은 다음과 같습니다:


\( \begin{bmatrix} 1/16 & 1/8 & 1/16 \\ 1/8 & 1/4 & 1/8 \\ 1/16 & 1/8 & 1/16 \end{bmatrix} \)


다음 예제코드는 크기 3의 Mask 행렬을 이용하여 계산된 Gaussian Blurring에 대한 것입니다. 본 예제코드에서는 코너 및 엣지 픽셀에 대한 특별한 처리는 하지 않았으며, 변수 nIterations는 Gaussian Blur 연산을 하는 횟수를 의미합니다.

Example Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
#include <iostream>
#include <opencv2/opencv.hpp>
 
#include <stdlib.h>
#include <stdio.h>
 
using namespace std;
using namespace cv;
 
#define M_ROWS  3
#define M_COLS  3
 
/* @ function main */
int main( int argc, char** argv )
{
  // Read an image
  cv::Mat image = cv::imread( {YOUR_IMAGE_PATH}, 1 );
  cv::Mat image_copy;
  cv::Mat image_tmp;
   
  int nRows = image.rows;
  int nCols = image.cols;
 
  // mask
  float fArMask[3][3];
 
  fArMask[0][0= 0.0625;
  fArMask[0][1= 0.125;
  fArMask[0][2= 0.0625;
 
  fArMask[1][0= 0.125;
  fArMask[1][1= 0.25;
  fArMask[1][2= 0.125;
 
  fArMask[2][0= 0.0625;
  fArMask[2][1= 0.125;
  fArMask[2][2= 0.0625;
 
  // copy image
  image.copyTo( image_copy );
  image.copyTo( image_tmp );
 
  float chRed, chGreen, chBlue;
  float fValRed, fValGreen, fValBlue;
 
  int nIterations = 5;
 
  // Gaussian blur
  forint nIter = 0 ; nIter < nIterations ; nIter++ ) {
 
    forint j = 1 ; j < nRows - 2 ; j++ ) {
 
      forint i = 1 ; i < nCols - 2 ; i++ ) {
 
        chRed = 0.0;
        chGreen = 0.0;
        chBlue = 0.0;
 
        forint m = 0 ; m < 3 ; m++ ) {
 
          forint k = 0 ; k < 3 ; k++ ) {
 
            fValBlue  = (float)( image_tmp.at<cv::Vec3b>( j+(m-1), i+(k-1) )[0] );
            fValGreen = (float)( image_tmp.at<cv::Vec3b>( j+(m-1), i+(k-1) )[1] );
            fValRed   = (float)( image_tmp.at<cv::Vec3b>( j+(m-1), i+(k-1) )[2] );
 
            chBlue  += fArMask[m][k] * fValBlue;
            chGreen += fArMask[m][k] * fValGreen;
            chRed += fArMask[m][k] * fValRed;
 
          }
 
        }
 
        // new image
        image_copy.at<cv::Vec3b>(j,i)[0= (int)chBlue;
        image_copy.at<cv::Vec3b>(j,i)[1= (int)chGreen;
        image_copy.at<cv::Vec3b>(j,i)[2= (int)chRed;
 
        // replace calculated image
        image_copy.copyTo( image_tmp );
 
      }
 
    }
 
  }
 
  // creates window
  cv::namedWindow( "Image Original"1 );
  cv::namedWindow( "Image Blurred"1 );
 
  // show stuff
  cv::imshow( "Image Original", image );
  cv::imshow( "Image Blurred", image_copy );
 
  // Wait until user press some key
  cv::waitKey();
 
  return 0;
}
cs


Results

하지만 늘 그렇듯이 OpenCV에 기본적인 Filter인 Gaussian Filter가 없을리 없습니다. OpenCV에 내장되어 있는 Gaussian Filter의 참고 사이트 위치는 다음과 같습니다:

http://docs.opencv.org/master/d4/d86/group__imgproc__filter.html#gaabe8c836e97159a9193fb0b11ac52cf1

Example Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <iostream>
#include <opencv2/opencv.hpp>
 
#include <stdlib.h>
#include <stdio.h>
 
using namespace std;
using namespace cv;
 
/* @ function main */
int main( int argc, char** argv )
{
    // Read an image
    cv::Mat image = cv::imread( {YOUR_IMAGE_PATH}, 1 );
    cv::Mat image_blur;
 
    // Gaussian blur
    GaussianBlur( image, image_blur, Size( 99 ), 2.02.0 );
 
    // creates window
    cv::namedWindow( "Image Original"1 );
    cv::namedWindow( "Image Gaussian Blurred"1 );
 
    // show stuff
    cv::imshow( "Image Original", image );
    cv::imshow( "Image Gaussian Blurred", image_blur );
 
    // Wait until user press some key
    cv::waitKey();
 
    return 0;
}
cs


Comments