# 【OpenCV_09】平滑/模糊图片 Smooth / Blur Images及 彩色图转 灰度图和二值化

1.归一化滤波平滑-Homogeneous Smoothing

2.高斯滤波平滑-Gaussian Smoothing

3.中值滤波平滑-Median Smoothing

4.双边滤波平滑-Bilateral Smoothing

• 平滑核的行像素数及列像素数必须是奇数(e.g. - 3x3, 11x5, 7x7, etc)
• 平滑核的size越大，计算时间越长。

### 归一化滤波平衡 Homogeneous Smoothing

OpenCV 代码

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"

using namespace cv;

int main( int argc, char** argv )
{
//create 2 empty windows
namedWindow( "Original Image" , CV_WINDOW_AUTOSIZE );
namedWindow( "Smoothed Image" , CV_WINDOW_AUTOSIZE );

// Load an image from file
Mat src = imread( "MyPic.JPG", 1 );

imshow( "Original Image", src );

Mat dst;
char zBuffer[35];

for ( int i = 1; i < 31; i = i + 2 )
{
//copy the text to the "zBuffer"
_snprintf_s(zBuffer, 35,"Kernel Size : %d x %d", i, i);

//smooth the image in the "src" and save it to "dst"
blur( src, dst, Size( i, i ) );

//put the text in the "zBuffer" to the "dst" image
putText( dst, zBuffer, Point( src.cols/4, src.rows/8), CV_FONT_HERSHEY_COMPLEX, 1, Scalar(255, 255, 255) );

//show the blurred image with the text
imshow( "Smoothed Image", dst );

//wait for 2 seconds
int c = waitKey(2000);

//if the "esc" key is pressed during the wait, return
if (c == 27)
{
return 0;
}
}

//make the "dst" image, black
dst = Mat::zeros( src.size(), src.type() );

//copy the text to the "zBuffer"
_snprintf_s(zBuffer, 35,"Press Any Key to Exit");

//put the text in the "zBuffer" to the "dst" image
putText( dst, zBuffer, Point( src.cols/4,  src.rows / 2), CV_FONT_HERSHEY_COMPLEX, 1, Scalar(255, 255, 255) );

//show the black image with the text
imshow( "Smoothed Image", dst );

//wait for a key press infinitely
waitKey(0);

return 0;

}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

 平滑图像 -可以看到随着平滑核增大，图像逐渐变得模糊

void blur( InputArray src, OutputArray dst, Size ksize, Point anchor=Point(-1,-1), int borderType = BORDER_DEFAULT )
• src - 源图像. (图像位深必须是; CV_8U, CV_16S, CV_16U, CV_32F or CV_64F)
• dst - 输出图像 (必须与源图像大小及位深一致)
• ksize - 核大小
• anchor - 点(-1,-1)的值意味着anchor是核中心的值。如果愿意可以自己定义自己的点。
• borderType - Y可以定义不同的边界插入方法，这个值仅仅影响边缘的像素。 (可选参数： BORDER_DEFAULT, BORDER_REFLECT, BORDER_REPLICATE, BORDER_TRANSPARENT, BORDER_REFLECT_101 )

• void putText( Mat& img, const string& text, Point org, int fontFace, double fontScale, Scalar color, int thickness=1, int lineType=8, bool bottomLeftOrigin=false )

• img - 欲显示文字的图片
• text - 欲在图片显示的文字
• org - 文本字符串在图像的左下角
• fontFace - 字体类型 (可选字体有： FONT_HERSHEY_SIMPLEX, FONT_HERSHEY_PLAIN, FONT_HERSHEY_DUPLEX, FONT_HERSHEY_COMPLEX, FONT_HERSHEY_TRIPLEX, FONT_HERSHEY_COMPLEX_SMALL, FONT_HERSHEY_SCRIPT_SIMPLEX or FONT_HERSHEY_SCRIPT_COMPLEX. 上面任何一个字体可以与FONT_ITALIC"按位与"（bitwise or）可以得到斜体字)
• fontScale - 缩放因子(如果设为1，默认大小)
• color - 文本以BGR颜色定义
• thickness - 字粗
• lineType - 线类型
• bottomLeftOrigin - 如果为true,原点设置在左下角。否则原点设定在左上角

• static MatExpr zeros(Size size, int type)
这个OpenCV的函数将返回指定的大小和类型的数组与零值
• size - 数组大小( e.g - Size(no. of columns, no. of rows)  )
• type -数组元素类型

### Gaussian Smoothing

"高斯平滑" 也叫 "高斯模糊" 或 "高斯过滤".是比较常用的一个平滑方法。是比较常见的平滑方法。也用于去除图像噪声。高斯核滑动扫描图像来对图像进行平滑。

OpenCV 代码

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"

using namespace cv;

int main( int argc, char** argv )
{
//create 2 empty windows
namedWindow( "Original Image" , CV_WINDOW_AUTOSIZE );
namedWindow( "Smoothed Image" , CV_WINDOW_AUTOSIZE );

// Load an image from file

imshow( "Original Image", src );

Mat dst;
char zBuffer[35];

for ( int i = 1; i  <  31; i = i + 2 )
{
//copy the text to the "zBuffer"
_snprintf_s(zBuffer, 35,"Kernel Size : %d x %d", i, i);

//smooth the image using Gaussian kernel in the "src" and save it to "dst"
GaussianBlur( src, dst, Size( i, i ), 0, 0 );

//put the text in the "zBuffer" to the "dst" image
putText( dst, zBuffer, Point( src.cols/4, src.rows/8), CV_FONT_HERSHEY_COMPLEX, 1, Scalar(255, 255, 255), 2 );

//show the blurred image with the text
imshow( "Smoothed Image", dst );

//wait for 2 seconds
int c = waitKey(2000);

//if the "esc" key is pressed during the wait, return
if (c == 27)
{
return 0;
}
}

//make the "dst" image, black
dst = Mat::zeros( src.size(), src.type() );

//copy the text to the "zBuffer"
_snprintf_s(zBuffer, 35,"Press Any Key to Exit");

//put the text in the "zBuffer" to the "dst" image
putText( dst, zBuffer, Point( src.cols/4,  src.rows / 2), CV_FONT_HERSHEY_COMPLEX, 1, Scalar(255, 255, 255) );

//show the black image with the text
imshow( "Smoothed Image", dst );

//wait for a key press infinitely
waitKey(0);

return 0;
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

 采用高斯模糊后得到的图像

• void GaussianBlur( InputArray src, OutputArray dst, Size ksize, double sigmaX, double sigmaY=0, int borderType=BORDER_DEFAULT )

• src - 源图像 (图像位深定义CV_8U, CV_16S, CV_16U, CV_32F or CV_64F)
• dst -  输出图像 (与输入图像位深及大小必须一致)
• ksize - 高斯平滑核大小 (核大小必须为正奇数)
• sigmaX - 在X方向的标准偏差。如果使用0，它会自动从内核尺寸计算
• sigmaY - 在Y方向的标准偏差。如果使用0，它会取和sigmaX一样的值.
• borderType - 可以定义各种边界插值方法。该值只影响在边界的像素。 ( k; BORDER_DEFAULT,可选参数 BORDER_REFLECT, BORDER_REPLICATE, BORDER_TRANSPARENT, BORDER_REFLECT_101 )

### Median Smoothing

“平均平滑处理”也被称为“中间模糊处理”或“值滤波”。这也是一种常见的平滑技术。输入图像进行卷积用中值的内核。中值滤波是广泛用于边缘检测算法，因为在某些情况下，它保留边缘的同时去除噪声。

OpenCV Code

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
using namespace cv;
int main( int argc, char** argv )
{
//create 2 empty windows
namedWindow( "Original Image" , CV_WINDOW_AUTOSIZE );
namedWindow( "Smoothed Image" , CV_WINDOW_AUTOSIZE );

// Load an image from file

imshow( "Original Image", src );

Mat dst;
char zBuffer[35];

for ( int i = 1; i  <  31; i = i + 2 )
{
//copy the text to the "zBuffer"
_snprintf_s(zBuffer, 35,"Kernel Size : %d x %d", i, i);

//smooth the image using Median kernel in the "src" and save it to "dst"
medianBlur( src, dst, i );

//put the text in the "zBuffer" to the "dst" image
putText( dst, zBuffer, Point( src.cols/4, src.rows/8), CV_FONT_HERSHEY_COMPLEX, 1, Scalar(255, 255, 255), 2 );

//show the blurred image with the text
imshow( "Smoothed Image", dst );

//wait for 2 seconds
int c = waitKey(2000);

//if the "esc" key is pressed during the wait, return
if (c == 27)
{
return 0;
}
}

//make the "dst" image, black
dst = Mat::zeros( src.size(), src.type() );

//copy the text to the "zBuffer"
_snprintf_s(zBuffer, 35,"Press Any Key to Exit");

//put the text in the "zBuffer" to the "dst" image
putText( dst, zBuffer, Point( src.cols/4,  src.rows / 2), CV_FONT_HERSHEY_COMPLEX, 1, Scalar(255, 255, 255) );

//show the black image with the text
imshow( "Smoothed Image", dst );

//wait for a key press infinitely
waitKey(0);

return 0;
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

New OpenCV Functions

• void medianBlur( InputArray src, OutputArray dst, int ksize )

• src - 输入源图像 ( images with 1, 3 or 4 channels / Image depth should be CV_8U for any value of "ksize". If "ksize" equals 3 or 5, image depths of CV_16U and CV_32F are also supported.
• dst - 输出图像 (需与源图像大小和位深一致)
• ksize - 滤波器的大小 ( 必须是奇数且大于1 ) (注意 - 滤波器的尺寸大小为ksize ksize)

### 双边平滑 Bilateral Smoothing

“双边平滑处理”也被称为“双边模糊处理”或“双边滤波”。这是最先进的过滤器，以平滑图像和减少噪音。同时去除噪声上述所有过滤器会抚平的边缘。但该过滤器能够减少图像的噪声，同时保留边缘。这种类型的过滤器的缺点是，它需要较长的时间来处理。

OpenCV 代码
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"

using namespace cv;

int main( int argc, char** argv )
{
//create 2 empty windows
namedWindow( "Original Image" , CV_WINDOW_AUTOSIZE );
namedWindow( "Smoothed Image" , CV_WINDOW_AUTOSIZE );

// Load an image from file

imshow( "Original Image", src );

Mat dst;
char zBuffer[35];

for ( int i = 1; i  <  31; i = i + 2 )
{
//copy the text to the "zBuffer"
_snprintf_s(zBuffer, 35,"Kernel Size : %d x %d", i, i);

//smooth the image using Bilateral filter in the "src" and save it to "dst"  bilateralFilter( src, dst, i, i, i);

//put the text in the "zBuffer" to the "dst" image
putText( dst, zBuffer, Point( src.cols/4, src.rows/8), CV_FONT_HERSHEY_COMPLEX, 1, Scalar(255, 255, 255), 2 );

//show the blurred image with the text
imshow( "Smoothed Image", dst );

//wait for 2 seconds
int c = waitKey(2000);

//if the "esc" key is pressed during the wait, return
if (c == 27)
{
return 0;
}
}

//make the "dst" image, black
dst = Mat::zeros( src.size(), src.type() );

//copy the text to the "zBuffer"
_snprintf_s(zBuffer, 35,"Press Any Key to Exit");

//put the text in the "zBuffer" to the "dst" image
putText( dst, zBuffer, Point( src.cols/4,  src.rows / 2), CV_FONT_HERSHEY_COMPLEX, 1, Scalar(255, 255, 255) );

//show the black image with the text
imshow( "Smoothed Image", dst );

//wait for a key press infinitely
waitKey(0);

return 0;
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

• void bilateralFilter( InputArray src, OutputArray dst, int d, double sigmaColor, double sigmaSpace, int borderType=BORDER_DEFAULT )

• src - 输入图像 (单通道或者三通道图像)
• dst - 输出图像(与输入图像属性一致)
• - 像素领域直径
• sigmaColor - 在颜色空间的sigma
• sigmaSpace - 在坐标空间的sigma
• borderType 可以定义各种边界插值方法。该值只影响在边界的像素。(可选参数如下： BORDER_DEFAULT, BORDER_REFLECT, BORDER_REPLICATE, BORDER_TRANSPARENT, BORDER_REFLECT_101 )

• 本文已收录于以下专栏：

## L0 范数图像平滑(L0 Smooth) 代码及详细注释 【OpenCV】

• panda1234lee
• 2016年10月15日 20:54
• 2035

## Smooth 函数 平滑处理函数 OpenCV

OpenCV Smooth 函数 各种方法的图像平滑 void cvSmooth( const CvArr* src, CvArr* dst, int smoothtype=CV_GAUS...
• xxx134617
• 2012年04月16日 19:22
• 5336

## Opencv之Smooth处理

#include "cv.h" #include "highgui.h" void example2_4(IplImage *image) {     cvNamedWindow("Ex...
• rekken
• 2011年10月20日 13:26
• 1141

## Smooth 函数 平滑处理函数 OpenCV

OpenCV Smooth 函数各种方法的图像平滑void cvSmooth( const CvArr* src, CvArr* dst, int smoothtype=CV_GAUSSIAN, in...
• lj19851227
• 2011年02月22日 19:09
• 2544

## 【OpenCV3】平滑处理详解

“平滑”通常又称“模糊”，是一种简单常用的图像处理操作。进行平滑处理的原因有很多，但通常是用来去除噪声和相机失真，平滑在按照一定的原理来降低图像分辨率中也有重要应用。 OpenCV2和OpenCV3中...
• guduruyu
• 2017年03月29日 14:00
• 3399

## 使用OpenCV进行图片模糊处理（归一化滤波器）

• u011043551
• 2017年06月04日 17:00
• 763

## 如何使用OpenCV的处理图像，文字变得锐利和清晰？(How to use OpenCV to process image so that the text become sharp and clea

• huobanjishijian
• 2017年06月05日 16:28
• 965

## OPENCV图像处理（二）：模糊

• qq_25819827
• 2016年07月27日 23:55
• 2094

## OpenCV--模糊图像操作

• qq_25343557
• 2017年11月29日 20:57
• 299

## OpenCV-图像模糊

OpenCV-图像模糊在之前我们介绍了opencv图像的基本操作，这里介绍一下利用OpenCV进行图像模糊的几个函数：1、blur( src, dst, Size( i, i ), Point(-1,...
• ahafg
• 2015年10月22日 21:42
• 3390

举报原因： 您举报文章：【OpenCV_09】平滑/模糊图片 Smooth / Blur Images及 彩色图转 灰度图和二值化 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)