前言

1.图像滤波也叫图像模糊,是平滑图像像素常用处理的方式,通常是为了达到减少图像噪声和伪影,或者降低图像分辨率,OpenCV提供了常用的五种图像模糊操作。
2.我的这里演示的系统环境是Linux,IDE是Qt creator,OpenCV的版本是3.30。

图像模糊

1.简单模糊
(1)blur()是实现简单模糊,是最常用的一种图像模糊方式,目标图像中的每个值都是源图像相应位置一个窗口中像素的平均值。
函数原型:

void blur(InputArray src,OutputArray,dst,Size ksize,Point anchor=Point(-1,-1),int borderType=BORDER_DEFAULT)

参数说明:
InputArray类型的src,输入图像,就是要模糊的图像,写Mat类对象即可,该函数对通道是独立处理的,且可以处理任意通道数的图片,处理图片深度应该是CV_8U,CV_16U,CV_16S,CV_32F,CV_64F之一;
OutputArray类型的dst,输出图像,需要和原图像有一样的尺寸和类型;比如可以用Mat::clone(()或者copyTo()得到,以源图片为模板来初始目标图;
Size类型的ksize,内核的大小,一般用Size(w,h)的写法来表示内核的大小,例如Size(3,3)就是3×3的核大小,核的大小一般为(3X3),(5X5)等奇数;
Point类型的anchor,表示锚点(即被平滑的那个点),注意有默认值Point(-1,-1),如果这个点坐标是负值的话就表示取核中心为锚点;
int类型的borderType,用于推断图像外部像素的某种边界模式,有默认值BORDER_DEFAULT,一般不去管它。

(2)代码演示

void simpleBlur(Mat &src, Mat &dst, int kesize)
{if(src.empty()){return;}blur(src,dst,Size(kesize,kesize));string str = to_string(kesize) + "X" + to_string(kesize);//在效果上加文字,对比几种核的效果putText(dst,str,Point(50,60),FONT_HERSHEY_SIMPLEX,2,Scalar(255,23,0),4,8);
}

(3)图像结果,可以看到几个核计大小的效果

2.中值滤波
(1)中值滤波是将目标图像每个像素的都替换为围绕这个像素的矩形领域内的平均像素。常用于去掉数字图像中的拍摄噪声。
API

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

参数说明:
InputArray src: 输入图像,图像为1、3、4通道的图像,当模板尺寸为3或5时,图像深度只能为CV_8U、CV_16U、CV_32F中的一个,如而对于较大孔径尺寸的图片,图像深度只能是CV_8U。
OutputArray类型的dst,输出图像,需要和原图像有一样的尺寸和类型;比如可以用Mat::clone(()或者copyTo()得到,以源图片为模板来初始目标图;
Size类型的ksize,内核的大小,一般用Size(w,h)的写法来表示内核的大小,例如Size(3,3)就是3×3的核大小,核的大小一般为(3X3),(5X5)等奇数;

代码演示:

void myMedianBlur(Mat &src, Mat &dst, int kesize)
{if(src.empty()){return;}medianBlur(src,dst,kesize);string str = to_string(kesize);putText(dst,str,Point(50,60),FONT_HERSHEY_SIMPLEX,2,Scalar(255,23,0),4,8);
}

运行效果,可以看到几个核大小的效果:
3.高斯滤波
(1)高斯滤波是通过对输入数组的每个点与输入的高斯滤波模板执行卷积计算然后将这些结果一块组成了滤波后的输出数组。
API:

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

参数说明:
InputArray类型的src,输入图像,即源图像,填Mat类的对象即可。它可以是单独的任意通道数的图片,但需要注意,图片深度应该为CV_8U,CV_16U, CV_16S, CV_32F 以及 CV_64F之一。
OutputArray类型的dst,即目标图像,需要和源图片有一样的尺寸和类型。比如可以用Mat::Clone,以源图片为模板,来初始化得到如假包换的目标图。
Size类型的ksize高斯内核的大小。其中ksize.width和ksize.height可以不同,但他们都必须为正数和奇数。或者,它们可以是零的,它们都是由sigma计算而来。
double类型的sigmaX,表示高斯核函数在X方向的的标准偏差。
double类型的sigmaY,表示高斯核函数在Y方向的的标准偏差。若sigmaY为零,就将它设为sigmaX,如果sigmaX和sigmaY都是0,那么就由ksize.width和ksize.height计算出来。
int类型的borderType,用于推断图像外部像素的某种边界模式。注意它有默认值BORDER_DEFAULT。

(2)代码演示

void myGaussianBlur(Mat &src, Mat &dst, int kesize)
{if(src.empty()){return;}GaussianBlur(src, dst, Size(kesize, kesize), 11, 11, 4);string str = to_string(kesize) + "X" + to_string(kesize);putText(dst,str,Point(50,60),FONT_HERSHEY_SIMPLEX,2,Scalar(255,23,0),4,8);
}

运行结果:
4.双边滤波
(1)双边滤波模板主要有两个模板生成,第一个是高斯模板,第二个是以灰度级的差值作为函数系数生成的模板,然后这两个模板点乘就得到了最终的双边滤波模板,第一个模板是全局模板,所以只需要生成以西,第二个模板需要对每个像素都计算一次。双边滤波器比高斯滤波器多了一个高斯方差sigma-d,它是基于空间分布的高斯滤波函数,所以在边缘附近,离的较远的像素不会太多影响到边缘上的像素,这样就能对边缘附近的像素值予以保存,但是由于保存过多的高频信息,对于彩色图像里的高频噪声,双边滤波器不能够干净的滤掉,只能够对于低频信息进行较好的滤除。
API:

C++: 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值,如果该值较大,则意味着颜色相近的较远的像素将相互影响,从而使更大的区域中足够相似的颜色获取相同的颜色。当d>0时,d指定了邻域大小且与sigmaSpace五官,否则d正比于sigmaSpace.
int borderType=BORDER_DEFAULT: 用于推断图像外部像素的某种边界模式,有默认值BORDER_DEFAULT.

代码演示:

oid myBilateralFilter(Mat &src, Mat &dst)
{if(src.empty()){return;}bilateralFilter(src, dst, 25, 25*2, 35);
}

图像效果:

OpenCV图像处理使用笔记(六)——图像滤波相关推荐

  1. OpenCV图像处理使用笔记(四)——图像融合

    前言常用 1.在OpenCV中定义了好多函数用来操作图像矩阵,有两个矩阵相加的,相减的,混合的,下面我使用QT加OpenCV演示图像融合这个函数. 2.我的IDE是Qt creator,OpenCV的 ...

  2. OpenCV图像处理使用笔记(五)——图像边界拓展

    前言 1.在OpenCV滤波和卷积算法中,在进行核运算的过程时候,矩阵边界拓展是一个非常重要的处理,OpenCV提供的函数copyMakeBorder()来拓展边界. 2.我的系统环境是Linux,加 ...

  3. Python+OpenCV图像处理(五)——图像阈值和二值化

    系列文章 Python+OpenCV图像处理(一)--OpenCV框架与图像插值算法 Python+OpenCV图像处理(二)--几何变换 Python+OpenCV图像处理(三)--彩色空间互换 P ...

  4. OpenCV图像处理(7)——图像上写TEXT

    在图像上写字 /* 参数说明: 1.输入输出图像 2.需要写的字符 3.文字的左上角坐标 4.字体 5.标准字体的放大倍数(越大,字体越大) 6... 7... */ putText(copySrc, ...

  5. OpenCV实战(12)——图像滤波详解

    OpenCV实战(12)--图像滤波详解 0. 前言 1. 频域分析 2. 低通滤波器 3. 图像下采样 3.1 使用低通滤波器下采样图像 3.2 内插像素值 4. 中值滤波器 5. 完整代码 小结 ...

  6. 《OpenCv视觉之眼》Python图像处理十六:Opencv图像处理实战一之图像中的硬币检测

    本专栏主要介绍如果通过OpenCv-Python进行图像处理,通过原理理解OpenCv-Python的函数处理原型,在具体情况中,针对不同的图像进行不同等级的.不同方法的处理,以达到对图像进行去噪.锐 ...

  7. 【OpenCV图像处理】十七、图像的导向滤波

    http://blog.csdn.net/qq_34784753/article/details/70229009?locationNum=12&fps=1 导向图滤波是一种图像滤波技术,通过 ...

  8. 数字图像处理学习笔记 六 彩色图像处理

    目录 (一)彩色模型介绍 1.1 RGB模型 1.2 CMY.CMYK模型 1.3 HSI彩色模型 1.4 HSV模型 1.5 YCbCr 彩色空间 (二)伪彩色图像处理 (三)全彩色图像处理及彩色变 ...

  9. 在OpenCV中利用卷积进行图像滤波

    简 介: 本文首先讨论了卷积核的概念,以及如何用于对图像进行滤波.然后通过他们对图像进行数学运算来实现特定的效果,比如平和和锐化.展示了如何在OpenCV中实现2D滤波. 在等同卷积卷积核之后,我们创 ...

最新文章

  1. EVA6400 Preferred path/mode
  2. java异常分析;剖析printStackTrace和fillInStackTrace
  3. 屏幕旋转的处理方法,实现视图位置的变化
  4. springmvc(6)乱码及restful风格
  5. 23种设计模式(5)-适配器模式
  6. Chapter 1 First Sight——37
  7. 用C#来开发CAD插件,含源代码
  8. matlab中modred,计算机仿真技术(中南大学)3系统模型及转换.ppt
  9. matlab2019使用仿真,simulink视频教程仿真建模matlab2019高级
  10. Adafruit_NeoPixel常用库函数详解
  11. 凤凰os linux双系统,逍遥安卓模拟器双系统无缝连接完胜Remix、凤凰OS
  12. Linux设备驱动-模块加载过程
  13. python 白盒测试_白盒测试方法
  14. python数据分析的常用方法_16种常用的数据分析方法汇总
  15. Restful API设计规范及实战
  16. Python彩色字符画
  17. 编程之美1:那些关于1的个数的经典面试题
  18. “System.NullReferenceException”类型的异常在 App_Web_j2s3gau3.dll 中发生,但未在用户代码中进行处理的Bug解决方案
  19. 安卓高通Diag命令解析
  20. 计算机一级电子表格求和,Excel表格如何进行单个求和以及批量求和操作-电脑自学网...

热门文章

  1. Mybatis获得参数值的两种方式:#{}和${}的区别
  2. vue 页面A转到页面B,B页面停留在A页面的滚动位置
  3. 二叉树的层序遍历 使用队列和不使用队列
  4. 《STL源码剖析》学习--6章--power算法分析
  5. fatal error C1083: 无法打开预编译头文件:“Debug\opencv.pch”: No such file or directory
  6. Java 7 源码学习系列(一)——String
  7. 人工智能:第七章 机器学习
  8. Matlab之while循环语句
  9. FISCO BCOS 2.0发布:新增群组架构克服吞吐瓶颈
  10. 进程间通信——POSIX 有名信号量与无名信号量