平滑处理(模糊处理):一种简单且使用频率很高的图像处理方法,常用于减少图像上的噪点或失真
图像滤波:图像预处理中,尽量保留图像细节特征条件下,对噪声进行抑制
平滑化和滤波操作:图像的能大部分集中在幅度谱的低频和中频段,在较高频段,有用信息经常被噪声淹没
滤波操作目的:1.特征模式识别2.消除噪声
平滑滤波:一类为模糊,另一类为消除噪音
五种平滑滤波的滤波器函数:
1.方框滤波BoxBlur 2.均值滤波Blur 3.高斯滤波 GaussianBlur 4.中值滤波medianBlur 5.双边滤波 bilateralFilter
其中前三种为线性滤波器,后二种为非线性滤波器
低通为模糊,高通为锐化,其本质都是滤波操作
邻域滤波(卷积):本质是根据给定的掩膜进行对中心像素进行的改变权值操作
算子如图
其权重核被称为滤波系数:g=f*h
方框滤波:最简单的线性滤波操作,看图
函数原型:void boxFilter(InputArray src,OutputArray dst,int ddepth,Size ksize,Point anchor=Point(-1,-1),boolnormalize = true,int borderType=BORDER_DEFAULT)
一参二参为输入输出图像,三参为输出图像深度,-1代表使用原图深度,即src.depth()
图像深度:图像深度是单个像素点的色彩详细度,如16位(65536色),32位等。
四参可理解为掩膜的尺寸,五参锚点(即被平滑的点),六参表示内核是否被归一化了,有默认值true,七参不用管
测试程序:
#include "opencv2/core/core.hpp" #include "opencv2/imgproc/imgproc.hpp" #include "opencv2/highgui/highgui.hpp" #include <iostream> using namespace cv; int main() { Mat src = imread("E://hashiqi.jpg"); imshow("原始图像", src); Mat dst; boxFilter(src, dst, -1, Size(5, 5), Point(-1, -1)); imshow("方框滤波", dst); waitKey(0); return 0; }测试结果:
均值滤波:
这就是跟方框滤波的区别,其它均保持一致
blur(src, dst2, Size(5, 5));测试结果:
均值滤波的缺陷:在去噪的过程中,不能很好的保护图片细节
高斯模糊:同样是一种加权取均值的模糊做法,但是考虑了邻域点权值较大,距离远的点邻域的权值应该较小的情况(权值分布参考正态分布),这样做到的加权均值更合理,对于一些服从正态分布的噪声信息,能更高效地消除
参数中sigmaX,sigmaY标准偏差,borderType还是一样,不用管
GaussianBlur(src, dst3, Size(5, 5), 0, 0);测试结果如下:
下面是结合TrackBar滑动条,修改掩膜尺寸,动态查看三种线性滤波的变换
#include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/imgproc.hpp> using namespace std; using namespace cv; Mat src, dst1,dst2,dst3; static int blur_value = 3; static int box_value = 3; static int gauss_value = 3; static void on_blur(int, void*); static void on_box(int, void*); static void on_gauss(int, void*); int main(int argc, char** argv) { src = imread("E://hashiqi.jpg", 0); imshow("原始图像", src); namedWindow("均值滤波", 1); createTrackbar("内核值", "均值滤波", &blur_value, 40, on_blur); namedWindow("方框滤波", 1); createTrackbar("内核值", "方框滤波", &box_value, 40, on_box); namedWindow("高斯滤波", 1); createTrackbar("内核值", "高斯滤波",&gauss_value,40,on_gauss); on_gauss(gauss_value, 0); on_box(box_value, 0); on_blur(blur_value, 0); waitKey(0); } static void on_blur(int, void*) { blur(src, dst1, Size(blur_value, blur_value), Point(-1, -1)); imshow("均值滤波", dst1); } static void on_box(int, void*) { boxFilter(src, dst2, -1, Size(box_value, box_value)); imshow("方框滤波", dst2); } static void on_gauss(int, void*) { GaussianBlur(src, dst3, Size(gauss_value, gauss_value), 0, 0); imshow("高斯滤波", dst3); }下面是两种非线性的滤波方式,中值滤波和双边滤波
中值滤波:
基本思想:使用像素点邻域灰度值的中值来代替该像素点的灰度值,但其滤波过程不是加权的,该方法在去除脉冲噪声,椒盐噪声的同时又能保留图像的边缘细节
函数原型:void medianBlur(InputArray src,OutputArray dst,int ksize);
medianBlur(src, dst4, media_value);双边过滤:
高斯滤波的思想,离中心越近的按正态分布来说,权值更大,但是有些情况下,信息值高的像素点分布在边缘,给定权值一少了之后,会丢失大量图像细节
本质就是比高斯滤波加了一个高斯方差,保证边缘像素点的权值不至于少的可怜,影响太多,这样就保证了边缘附近像素点的保留。但是对高频噪声,双边过滤不能干净地过滤掉,只能对于低频信息进行很好的过滤。
函数原型:void bilateralFiliter(InputAttay src,OutputArray dst,int d,double sigmaColor,double sigmaSpace,int borderType = BORDER_DAULT)
bilateralFilter(src, dst4, bli_value, bli_value * 2, bli_value / 2);三参:表示每个像素邻域的直径 四参:sigmaColor这个值越大,代表像素邻域内有越宽广的颜色会被混合到一起,从而产生相对的半相等颜色区域 五参:坐标空间中滤波器的sigma值,坐标空间的标注方差,通俗的说,参数值越大,越远的像素会相互影响,是更大区域的颜色归一化。
以上是基础的五种滤波方式,三种线性的,两种非线性的,基本上都是低频滤波,也就是模糊操作。