일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- c++
- 김양재
- No SQL
- Big Data
- 김양재 목사
- 빅데이타
- 몽고디비
- WebGL
- MongoDB
- 통계
- Artificial Intelligence
- nodeJS
- node.js
- openCV
- 우리들교회
- Statistics
- 확률
- probability
- 데이터 과학
- Machine Learning
- R
- 딥러닝
- 빅데이터
- 빅 데이터
- data science
- 인공지능
- 빅 데이타
- Deep learning
- 김양재 목사님
- 주일설교
- Today
- Total
Scientific Computing & Data Science
[OpenCV] Gaussian Blur 본문
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 for( int nIter = 0 ; nIter < nIterations ; nIter++ ) { for( int j = 1 ; j < nRows - 2 ; j++ ) { for( int i = 1 ; i < nCols - 2 ; i++ ) { chRed = 0.0; chGreen = 0.0; chBlue = 0.0; for( int m = 0 ; m < 3 ; m++ ) { for( int 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( 9, 9 ), 2.0, 2.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 |
'Programming > OpenCV' 카테고리의 다른 글
[OpenCV] Sobel Edge Detector (0) | 2015.07.21 |
---|---|
[OpenCV] RGB Color를 Grayscale로 변환하기 (3) | 2015.07.21 |
[OpenCV] 원본 이미지 상에 컬러 입히기 (0) | 2015.07.08 |
[OpenCV] 특정 픽셀 컬러 정보 얻어내기 (3) | 2015.07.04 |
[OpenCV] resize 함수를 이용하여 이미지 사이즈 조정하기 (0) | 2015.04.01 |