1、图像滤波理论

1.1图像滤波理论

图像滤波即在尽量保留图像细节特征的条件下对目标图像的噪声进行抑制,是图像预处理中不可缺少的操作。消除图像中的噪声又叫做图像滤波或平滑,滤波的目的有两个,一是突出特征以方便处理,二是抑制噪声。

空间域滤波就是在图像平面上对像素进行操作。空间域滤波大体分为两类:平滑、锐化。

平滑滤波:模糊处理,用于减小噪声,实际上是低通滤波,典型的滤波器是高斯滤波。

锐化滤波:提取边缘突出边缘及细节、弥补平滑滤波造成的边缘模糊。实际上是高通滤波。

空间域处理可由下式表示:

g(x,y)=T[f(x,y)]

式中,f(x,y)是输入图像,g(x,y)是处理后的图像,T是在点(x,y)的邻域上定义的关于f的一种算子,算子可应用于单幅图像或图像集合。

1.2邻域滤波算子

1)空间滤波器由一个邻域(通常是一个较小的矩形)和对该邻域所包围图像像素执行的预定义操作组成。对预定义的点(x,y)为中心的领域内的像素进行计算。

2)滤波产生一个新像素,用计算后的新像素值代替点(x,y)的值。

3)循环步骤1和2,滤波器的中心遍历图像中的每个像素后,就生成了滤波后的图像。

4)如果在图像像素上执行的是线性操作,则该滤波器称为线性空间滤波器,否则,称为非线性空间滤波器。

一般来说,使用大小为 m×n的滤波器对大小为 M×N的图像进行线性空间滤波,可由下式表示:

2、OpenCV滤波方法

滤波处理分为两大类:线性滤波和非线性滤波。OpenCV里有这些滤波的函数,使用起来非常方便。

线性滤波:

1.方框滤波BoxBlur:模糊图像

2.均值滤波Blur:模糊图像

3.高斯滤波GaussianBlur:信号的平滑处理,去除符合正太分布的噪声

非线性滤波:

1.中值滤波mediaBlur:去除椒盐噪声

2.双边滤波BilateralFilter:保边去噪

3、线性滤波器

3.1平滑滤波

一般来说,图像具有局部连续的性质,即相邻的像素的值相近,而噪声使得噪点处产生像素跳跃,所以通过平滑噪点可以减少噪声,去除图像中的不相关细节。

方框滤波BoxBlur和均值滤波Blur都是对邻域内做平均值来滤波,属于平滑滤波。滤波的输出是包含在滤波器模板邻域内的像素的平均值,方框滤波做归一化之后就变为均值滤波,这两个滤波器都是低通滤波器。

函数原型如下:

CV_EXPORTS_W void boxFilter( InputArray src, OutputArray dst, int ddepth,
Size ksize, Point anchor=Point(-,-),
bool normalize=true,
int borderType=BORDER_DEFAULT );
CV_EXPORTS_W void blur( InputArray src, OutputArray dst,
Size ksize, Point anchor=Point(-,-),
int borderType=BORDER_DEFAULT );

3.2高斯滤波

高斯滤波对于图像来说就是一个低通滤波,广泛用于消除高斯噪声,高速滤波就是一种加权滤波,只不过模板中的系数由高斯分布来确定的,高斯滤波器根据高斯函数的形状来选择滤波模板权值的线性平滑滤波器。高斯平滑滤波器对于抑制服从正态分布的噪声非常有效。

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

3.3测试实验

Mat img;
Mat img1, img2, img3;
int gBoxFilterValue = ;
int gMeanBlurValue = ;
int gGaussianBlurValue = ; static void OnBoxFilter(int filterSz, void *)
{
boxFilter(img, img1, -, Size(filterSz +, filterSz +));
imshow("方框滤波", img1);
} static void OnMeaanBlur(int filterSz, void *)
{
blur(img, img2, Size(filterSz + , filterSz + ));
imshow("均值滤波", img2);
} static void OnGaussinanBlur(int filterSz, void *)
{
GaussianBlur(img, img3, Size(filterSz* + , filterSz* + ), , );
imshow("高斯滤波", img3);
} int main() {
img = imread("D:/WORK/5.OpenCV/LeanOpenCV/pic_src/pic2.bmp");
img1 = img.clone();
img2 = img.clone();
img3 = img.clone();
imshow("原图", img); namedWindow("方框滤波", );
createTrackbar("内核值", "方框滤波", &gBoxFilterValue, , OnBoxFilter);
OnBoxFilter(gBoxFilterValue, ); namedWindow("均值滤波", );
createTrackbar("内核值", "均值滤波", &gMeanBlurValue, , OnMeaanBlur);
OnMeaanBlur(gMeanBlurValue, ); namedWindow("高斯滤波", );
createTrackbar("内核值", "高斯滤波", &gGaussianBlurValue, , OnGaussinanBlur);
OnGaussinanBlur(gGaussianBlurValue, );
waitKey();
}

输出结果如下图。

4、非线性滤波器

4.1中值滤波

中值滤波属于非线性滤波,其思想用滤波模板邻域内的像素的平均值来代替像素点的灰度值。中值滤波器是一种统计排序滤波器,图像上点(x,y),中值滤波以该点为中心,领域内所有像素的统计排序中值作为此点的响应,中值滤波是非线性滤波。相比与均值滤波和高斯滤波,中值滤波可以有效的降低随机噪声,直接忽略掉噪声点,把噪声引起的模糊降到最低。线性滤波器在滤波的同时会造成图像细节模糊,中值滤波可以避免这个问题,其典型的应用就是中值滤波消除斑点噪声、椒盐噪声。

CV_EXPORTS_W void medianBlur( InputArray src, OutputArray dst, int ksize );

使用中值滤波,滤除椒盐噪声例子如下。

img = imread("D:/WORK/5.OpenCV/LeanOpenCV/pic_src/pic2.bmp");
salt(img, ); img1 = img.clone();
img2 = img.clone();
img3 = img.clone();
imshow("原图", img); namedWindow("高斯滤波", );
createTrackbar("内核值", "高斯滤波", &gGaussianBlurValue, , OnGaussinanBlur);
OnGaussinanBlur(gGaussianBlurValue, ); namedWindow("中值滤波", );
createTrackbar("内核值", "中值滤波", &gMedianBlurValue, , OnMedianBlur);
OnMedianBlur(gMedianBlurValue, ); waitKey();
}

输出结果如下图。高斯滤波在滤除噪点的同时也造成了图像模糊,如果增大内核则会造成严重模糊失真,而中值滤波对椒盐噪声有很好的抑制作用。

4.2双边滤波

高斯滤波属于加权平均滤波,距离中心点越近的点越有较大权重,这种方法符合图像的平滑变化的特征,但是在边缘区域,像素值出现突变,这种方法反而会滤掉边缘轮廓,损失掉有用的边缘信息。边缘保护滤波方法,双边滤波就是最常用的边缘保护滤波方法,就是为了处理这种情况而发明的。

双边滤波(Bilateral filter)是一种非线性的滤波方法,是结合图像的空间邻近度和像素值相似度的一种折衷处理,同时考虑空域信息和灰度相似性,达到保边去噪的目的。双边滤波将高斯滤波中通过各个点到中心点的空间临近度计算的各个权值进行优化,将其优化为空间临近度计算的权值和像素值相似度计算的权值的乘积,优化后的权值再与图像作卷积运算,从而达到保边去噪的效果。

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

InputArray src: 输入图像,可以是Mat类型,图像必须是8位或浮点型单通道、三通道的图像。

OutputArray dst: 输出图像,和原图像有相同的尺寸和类型。

int d: 表示在过滤过程中每个像素邻域的直径范围。如果这个值是非正数,则函数会从第五个参数sigmaSpace计算该值。

double sigmaColor: 颜色空间过滤器的sigma值,这个参数的值越大,更大的值域空间影响结果。

double sigmaSpace: 坐标空间中滤波器的sigma值,如果该值较大,更大的定义域空间影响结果。

int borderType=BORDER_DEFAULT:边界模式,有默认值BORDER_DEFAULT.

static void OnBilateralFilter(int filterSz, void *)
{
bilateralFilter(img, img3, filterSz, filterSz * , filterSz / );
imshow("双边滤波", img3);
} namedWindow("双边滤波", );
createTrackbar("内核值", "双边滤波", &gMedianBlurValue, , OnBilateralFilter);
OnBilateralFilter(gMedianBlurValue, );

输出效果如下图。双边滤波在较大的参数范围内都保持了很好的噪声抑制特性,并且没有造成边缘模糊。

5、遇到的问题medianBlur报异常

调节中值滤波的滑动条时,出现异常。

vs报错:

未经处理的异常:

0x00007FF835C09159 处(位于 Day1.exe 中)有未经处理的异常: Microsoft C++ 异常: cv::Exception,位于内存位置 0x000000F29FAFE138 处。

解决方法:

中值滤波的参数ksize需要为偶数。

@param src input -, -, or -channel image; when ksize is  or , the image depth should be
CV_8U, CV_16U, or CV_32F, for larger aperture sizes, it can only be CV_8U.
@param dst destination array of the same size and type as src.
@param ksize aperture linear size; it must be odd and greater than , for example: , , ...
@sa bilateralFilter, blur, boxFilter, GaussianBlur
*/
CV_EXPORTS_W void medianBlur( InputArray src, OutputArray dst, int ksize );

使用例子:

static void OnMedianBlur(int filterSz, void *)
{
if (filterSz % == ) filterSz += ;
medianBlur(img, img2, filterSz);
imshow("中值滤波", img2);
}

测试效果图如下:

6、参考文献

1、《OpenCV3 编程入门》,电子工业出版社,毛星雨著

2、《学习OpenCV》,清华大学出版社,Gary Bradski, Adrian kaehler著

3、OpenCV双边滤波详解及实代码实现

https://blog.csdn.net/qq_36359022/article/details/80198890

4、Bilateral Filtering for Gray and Color Images

https://users.soe.ucsc.edu/~manduchi/Papers/ICCV98.pdf

5、Smoothing Images

https://docs.opencv.org/4.1.2/dc/dd3/tutorial_gausian_median_blur_bilateral_filter.html

6、OpenCV图像处理之滤波

https://blog.csdn.net/qq_30815237/article/details/86690190

尊重原创技术文章,转载请注明。

https://www.cnblogs.com/pingwen/p/12305777.html

OpenCV3入门(六)图像滤波的更多相关文章

  1. opencv学习之路(12)、图像滤波

    一.图像滤波简介 二.方框滤波——boxFilter() #include<opencv2/opencv.hpp> using namespace cv; void main(){ Mat ...

  2. opencv第三课,图像滤波

    1.介绍 OpenCV图像处理技术中比较热门的图像滤波操作主要被分为了两大类:线性邻域滤波和非线性滤波.线性邻域滤波常见的有“方框滤波“,”均值滤波“和”高斯滤波“三种,二常见的非线性滤波主要是中值滤 ...

  3. 图像滤波与OpenCV中的图像平滑处理

    .About图像滤波 频率:可以这样理解图像频率,图像中灰度的分布构成一幅图像的纹理.图像的不同本质上是灰度分布规律的不同.但是诸如"蓝色天空"样的图像有着大面积近似的灰度强度,而 ...

  4. DevExpress XtraReports 入门六 控件以程序方式创建一个 交叉表 报表

    原文:DevExpress XtraReports 入门六 控件以程序方式创建一个 交叉表 报表 本文只是为了帮助初次接触或是需要DevExpress XtraReports报表的人群使用的,为了帮助 ...

  5. OpenCV成长之路:图像滤波

    http://ronny.blog.51cto.com/8801997/1394138 OpenCV成长之路:图像滤波 2014-04-11 14:28:44 标签:opencv 边缘检测 sobel ...

  6. Spring Boot入门(六):使用MyBatis访问MySql数据库(注解方式)

    本系列博客记录自己学习Spring Boot的历程,如帮助到你,不胜荣幸,如有错误,欢迎指正! 本篇博客我们讲解下在Spring Boot中使用MyBatis访问MySql数据库的简单用法. 1.前期 ...

  7. 脑残式网络编程入门(六):什么是公网IP和内网IP?NAT转换又是什么鬼?

    本文引用了“帅地”发表于公众号苦逼的码农的技术分享. 1.引言 搞网络通信应用开发的程序员,可能会经常听到外网IP(即互联网IP地址)和内网IP(即局域网IP地址),但他们的区别是什么?又有什么关系呢 ...

  8. 网络编程懒人入门(六):深入浅出,全面理解HTTP协议

    本文引用了自简书作者“涤生_Woo”的文章,内容有删减,感谢原作者的分享. 1.前言 HTTP(全称超文本传输协议,英文全称HyperText Transfer Protocol)是互联网上应用最为广 ...

  9. C#基础入门 六

    C#基础入门 六 静态类进阶 静态构造方法 用于初始化任何静态数据,或用于执行仅需执行一次的特定操作,在创建第一个实例或引用任何静态成员之前,将自动调用静态构造函数,静态构造方法是无参数的. publ ...

随机推荐

  1. ECShop二次开发指南(一)

    ECSHOP是一套完整的网络商店解决方案,包括前台的商品展示.购物流程和强大易用的后台管理.由于 ecshop简单易用,使用者几乎可以在3几分钟简单的设置一下就可以拥有一个网上商店系统,所以很多的B2 ...

  2. java之斗地主

    hashmap集合+ArrayList集合+Collections集合工具类shuffle()和sort()hashmap中get(key).put(key/value)Arraylist中的add( ...

  3. 「2018-12-02模拟赛」T1 最短路 解题报告

    1.最短路(short.pas/cpp/in/out) 问题描述: 小 C 终于被小 X 感动了,于是决定与他看电影,然而小 X 距离电影院非常远,现在假设 每条道路需要花费小 X 的时间为 1,由于 ...

  4. 利用自编码(Autoencoder)来提取输入数据的特征

    自编码(Autoencoder)介绍 Autoencoder是一种无监督的学习算法,将输入信息进行压缩,提取出数据中最具代表性的信息.其目的是在保证重要特征不丢失的情况下,降低输入信息的维度,减小神经 ...

  5. 关于opengl中的矩阵平移,矩阵旋转,推导过程理解 OpenGL计算机图形学的一些必要矩阵运算知识

    原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/12166896.html 为什么引入齐次坐标的变换矩阵可以表示平移呢? - Yu Mao的回答 ...

  6. Ant Design中getFieldDecorator方法的特殊用法(小bug)

    记录Ant Design中getFieldDecorator方法的特殊的一个用法 了解Ant Design表单的小伙伴都知道,getFieldDecorator在大部分情况下是用来绑定一个控件的,即像 ...

  7. WPF 给Button按钮加小图标图片Image

    前言:当WPF项目后台完成到一定程度的时候,就可以对XAML前端进行美化啦,个人认为XAML前端还是挺有意思的. 下面举一个Button加过小图标后的例子: 是不是比生硬的文字看来更人性化了呢? 不多 ...

  8. Sentinel :微服务哨兵

    1. Sentinel 是什么? 随着微服务的流行,服务和服务之间的稳定性变得越来越重要.Sentinel 以流量为切入点,从流量控制.熔断降级.系统负载保护等多个维度保护服务的稳定性. Sentin ...

  9. Navicat10.1.11使用记录

    设计表的时候有个允许空值(null),如果不勾选,则无法插入null(但是可以插入‘null’),且默认值不能为null: 如果某个字段没有设置默认值,而插入时又没有给此字段赋值,则会提示warnin ...

  10. 让vue-router渲染为指定的标签

    <router-link :to="{name:'cart'}" tag="li"> cart </router-link> 在rout ...