10. Smoothing.cpp 图像平滑处理
演示不同滤波器的效果。这些滤波器包括均值滤波、高斯滤波、中值滤波和双边滤波。每个滤波器都会在原始图像上应用,并显示滤波后的效果。
/**
* 文件 Smoothing.cpp
* 简单滤镜的样例代码
* 作者 OpenCV团队
*/
//引入所需库文件
#include <iostream>
#include "opencv2/imgproc.hpp"
#include "opencv2/imgcodecs.hpp"
#include "opencv2/highgui.hpp"
using namespace std;
using namespace cv;
//定义一些全局变量
int DELAY_CAPTION = 1500; //延迟时间
int DELAY_BLUR = 100; //模糊延迟时间
int MAX_KERNEL_LENGTH = 31; //最大滤镜核心大小
Mat src; Mat dst; // 定义两个Mat变量,src存储原始图像,dst用于存储处理后的图像
char window_name[] = "Smoothing Demo"; //程序窗口的名字
//函数声明
int display_caption( const char* caption ); //显示文字
int display_dst( int delay ); //显示图片
/**
* 主函数
*/
int main( int argc, char ** argv )
{
//创建一个窗口
namedWindow( window_name, WINDOW_AUTOSIZE );
//载入原始图像
const char* filename = argc >=2 ? argv[1] : "lena.jpg"; //如果用户没有输入,则默认打开lena.jpg
src = imread( samples::findFile( filename ), IMREAD_COLOR ); //使用imread函数读取图像文件
if (src.empty())
{
printf(" Error opening imagen\n"); //如果图像为空,则打印错误信息
printf(" Usage:\n %s [image_name-- default lena.jpg] n", argv[0]); //显示使用说明
return EXIT_FAILURE; //结束程序
}
//显示原始图像
if( display_caption( "Original Image" ) != 0 )
{
return 0; //如果失败,结束程序
}
dst = src.clone(); //克隆src到dst
if( display_dst( DELAY_CAPTION ) != 0 )
{
return 0; //如果失败,结束程序
}
//应用均值模糊
if( display_caption( "Homogeneous Blur" ) != 0 )
{
return 0; //显示标题失败,结束程序
}
for ( int i = 1; i < MAX_KERNEL_LENGTH; i = i + 2 )
{
//应用模糊滤镜
blur( src, dst, Size( i, i ), Point(-1,-1) );
if( display_dst( DELAY_BLUR ) != 0 )
{
return 0; //显示图像失败,结束程序
}
}
//应用高斯模糊
if( display_caption( "Gaussian Blur" ) != 0 )
{
return 0; //显示标题失败,结束程序
}
//应用高斯模糊滤镜
for ( int i = 1; i < MAX_KERNEL_LENGTH; i = i + 2 )
{
GaussianBlur( src, dst, Size( i, i ), 0, 0 );
if( display_dst( DELAY_BLUR ) != 0 )
{
return 0; //显示图像失败,结束程序
}
}
//应用中值模糊
if( display_caption( "Median Blur" ) != 0 )
{
return 0; //显示标题失败,结束程序
}
//应用中值模糊滤镜
for ( int i = 1; i < MAX_KERNEL_LENGTH; i = i + 2 )
{
medianBlur ( src, dst, i );
if( display_dst( DELAY_BLUR ) != 0 )
{
return 0; //显示图像失败,结束程序
}
}
//应用双边滤波
if( display_caption( "Bilateral Blur" ) != 0 )
{
return 0; //显示标题失败,结束程序
}
//应用双边滤波器
for ( int i = 1; i < MAX_KERNEL_LENGTH; i = i + 2 )
{
bilateralFilter ( src, dst, i, i*2, i/2 );
if( display_dst( DELAY_BLUR ) != 0 )
{
return 0; //显示图像失败,结束程序
}
}
//完成
display_caption( "Done!" );
return 0;
}
/**
* @function display_caption 显示标题函数
*/
int display_caption( const char* caption )
{
dst = Mat::zeros( src.size(), src.type() ); //暂时将dst置为src相同大小的全零矩阵
putText( dst, caption,
Point( src.cols/4, src.rows/2),
FONT_HERSHEY_COMPLEX, 1, Scalar(255, 255, 255) ); //将标题文字写入dst图片中
return display_dst(DELAY_CAPTION); //显示dst图片
}
/**
* @function display_dst 显示dst图片函数
*/
int display_dst( int delay )
{
imshow( window_name, dst ); //显示窗口中的dst图片
int c = waitKey ( delay ); //等待按键事件
if( c >= 0 ) { return -1; } //如果有按键输入,则返回-1
return 0; //否则返回0
}