第四课 滤波方式
滤波是过滤图片数据中的噪声,换种说法就是用一些巧妙的计算方法去改变图像矩阵的数值,从而使图像改变状态。
这里以均值滤波为例,均值滤波(即为图片马赛克效果)就是定义了一个自定大小的内核矩阵,在一张1024*960像素大小的图片中,对九十多万个像素点进行运算,当内核矩阵为3x3时,即对矩形范围内的9个像素点的色彩通道等数据取均值,将矩形范围内的九个像素点的值一致化。当这个内核矩阵的边值较小时,图像处理后的效果即为简单的模糊,内核矩阵的边值足够大时,多个像素点的内值一致化,人眼就可看出马赛克的效果。对于高斯滤波、双边滤波、中指滤波等滤波方式,其运算过程也不尽相同,只是内核矩阵可能不同,运算方式可能不同。
对于上面的长篇大论也许不用太深究,当满足实际工程需要时,查找一下各种滤波方式的运算方式即可,比如均值滤波是马赛克效果,高斯滤波是模糊效果。行了废话不多说,下面是示例代码,函数声明以及相关注释代码中都很详细。
#include <opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <iostream>
using namespace std;
using namespace cv;
//-----------------------------------【全局变量声明部分】--------------------------------------
Mat g_srcImage, g_dstImage1, g_dstImage2, g_dstImage3,g_dstImage4, g_dstImage5;//存储图片的Mat类型
int g_nBoxFilterValue = 3; //方框滤波参数值
int g_nMeanBlurValue = 3; //均值滤波参数值
int g_nGaussianBlurValue = 3; //高斯滤波参数值
int g_nMedianBlurValue = 10; //中值滤波参数值
int g_nBilateralFilterValue = 10; //双边滤波参数值
//-----------------------------------【全局函数声明部分】--------------------------------------
//轨迹条的回调函数如下
static void on_BoxFilter(int, void*); //方框滤波的回调函数
static void on_MeanBlur(int, void*); //均值滤波的回调函数
static void on_GaussianBlur(int, void*); //高斯滤波的回调函数
static void on_MedianBlur(int, void*); //中值滤波的回调函数
static void on_BilateralFilter(int, void*); //双边滤波的回调函数
//-----------------------------------【main( )函数】--------------------------------------------
int main()
{
//改变console字体颜色
system("color 5E");
//载入原图
g_srcImage = imread("1.jpg", 1);
if (!g_srcImage.data) { printf("Oh,no,读取srcImage错误~!\n"); return false; }
//克隆原图到三个Mat类型中,尺寸类型必须一致,故直接克隆,或者参考学习程序三,定义一个黑图也可。
g_dstImage1 = g_srcImage.clone();
g_dstImage2 = g_srcImage.clone();
g_dstImage3 = g_srcImage.