基于OpenCV平滑图像也就是图像模糊,本博文介绍使用OpenCV的不同函数通过线性滤波进行图像平滑。

cv::blur
cv::GaussianBlur (高斯模糊)
cv::medianBlur (中值模糊)
cv::bilateralFilter (双边滤波)

理论

进行图像平滑的目的有很多,本文的目的是减少噪音。

线性滤波为最常用滤波方式, 输出像素的值 g(i,j) 取决于一组输入像素f(i+k,j+l)的加权和:

  • g(i,j)=∑k,lf(i+k,j+l)h(k,l)

    其中,h(k,l)   被称为核(滤波器的系数).也就是一个滑动窗.

归一化块滤波器

最简单的滤波器,每一个像素的输出值,是其核决定的相邻像素的均值。核的形式如下:

  • K=1Kwidth⋅Kheight⎡⎣⎢⎢⎢⎢⎢11..111..111..1...............11111⎤⎦⎥⎥⎥⎥⎥

高斯滤波

高斯滤波是一种线性平滑滤波,适用于消除高斯噪声,广泛应用于图像处理的减噪过程。通俗的讲,高斯滤波就是对整幅图像进行加权平均的过程,每一个像素点的值,都由其本身和邻域内的其他像素值经过加权平均后得到。高斯滤波的具体操作是:用一个模板(或称卷积、掩模)扫描图像中的每一个像素,用模板确定的邻域内像素的加权平均灰度值去替代模板中心像素点的值。

可能是最有用的滤波器 (不是最快的).高斯滤波是通过像素点和高斯核卷积和实现。通过下图作说明,还记得 1维 高斯核像什么么?

  • 假设图像是1维的, 可以看到排在中间位置的像素具有最大的权重. 相邻像素的权因子随着和中心像素的距离的增大递减。

    备注:
    2维高斯核函数可以表示为 :

    G0(x,y)=Ae−(x−μx)22σ2x+−(y−μy)22σ2y

其中 μ 是均值 (the peak) , σ 表示方差 (per each of the variables x and y)

中值滤波

中值滤波是基于排序统计理论的一种能有效抑制噪声的非线性信号处理技术,中值滤波的基本原理是把数字图像或数字序列中一点的值用该点的一个邻域中各点值的中值代替,让周围的像素值接近的真实值,从而消除孤立的噪声点。中值滤波对脉冲噪声有良好的滤除作用,特别是在滤除噪声的同时,能够保护信号的边缘,使之不被模糊。这些优良特性是线性滤波方法所不具有的。

双边滤波

目前为止,已经介绍了一些图像平滑方法,虽然消除了噪声但是同事也平滑了边缘。为了避免平滑边缘可以使用双边滤波。

双边滤波(Bilateral filter)是一种非线性的滤波方法,是结合图像的空间邻近度和像素值相似度的一种折衷处理,同时考虑空域信息和灰度相似性,达到保边去噪的目的。具有简单、非迭代、局部的特点。
双边滤波器的好处是可以做边缘保存(edge preserving),一般过去用的维纳滤波或者高斯滤波去降噪,都会较明显地模糊边缘,对于高频细节的保护效果并不明显。双边滤波器顾名思义比高斯滤波多了一个高斯方差sigma-d,它是基于空间分布的高斯滤波函数,所以在边缘附近,离的较远的像素不会太多影响到边缘上的像素值,这样就保证了边缘附近像素值的保存。但是由于保存了过多的高频信息,对于彩色图像里的高频噪声,双边滤波器不能够干净的滤掉,只能够对于低频信息进行较好的滤波。

和高斯滤波器类似,双边滤波器也考虑相邻的像素分配的权重。这些权重有两个组成部分,第一个是高斯滤波器相同权权重。第二个是考虑相邻像素之间的强度的差异和评价。

详细的介绍参见这里 this link

代码

打开一副图像并应用4种平滑方法。

/*** file Smoothing.cpp* brief Sample code for simple filters* author OpenCV team*/#include "opencv2/imgproc.hpp"
#include "opencv2/imgcodecs.hpp"
#include "opencv2/highgui.hpp"using namespace std;
using namespace cv;/// Global Variables
int DELAY_CAPTION = 1500;
int DELAY_BLUR = 100;
int MAX_KERNEL_LENGTH = 31;Mat src; Mat dst;
char window_name[] = "Smoothing Demo";/// Function headers
int display_caption( const char* caption );
int display_dst( int delay );/*** function main*/
int main( void )
{namedWindow( window_name, WINDOW_AUTOSIZE );/// Load the source imagesrc = imread( "lena.jpg", IMREAD_COLOR );if( display_caption( "Original Image" ) != 0 ) { return 0; }dst = src.clone();if( display_dst( DELAY_CAPTION ) != 0 ) { return 0; }/// Applying Homogeneous blurif( 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; } }//![blur]/// Applying Gaussian blurif( 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; } }//![高斯滤波]/// Applying Median blurif( 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; } }//![中值滤波]/// Applying Bilateral Filterif( 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; } }//![双边滤波]/// Wait until user press a keydisplay_caption( "End: Press a key!" );waitKey(0);return 0;
}/*** @function display_caption*/
int display_caption( const char* caption )
{dst = Mat::zeros( src.size(), src.type() );putText( dst, caption,Point( src.cols/4, src.rows/2),FONT_HERSHEY_COMPLEX, 1, Scalar(255, 255, 255) );imshow( window_name, dst );int c = waitKey( DELAY_CAPTION );if( c >= 0 ) { return -1; }return 0;
}/*** @function display_dst*/
int display_dst( int delay )
{imshow( window_name, dst );int c = waitKey ( delay );if( c >= 0 ) { return -1; }return 0;
}

基于OpenCV平滑图像相关推荐

  1. 基于Opencv的图像卡通化

    基于Opencv的图像卡通化 基于Opencv的图像卡通化 铅笔素描效果 国画效果 抽象效果 基于Opencv的图像卡通化 主要工具是高斯滤波器.细节增强滤波器.双边滤波.拉普拉斯滤波器. 铅笔素描效 ...

  2. 基于OPENCV和图像减法的PCB缺陷检测

    基于OPENCV和图像减法的PCB缺陷检测 原文地址:PCB defect detection USING OPENCV with image subtraction method Abstract ...

  3. OpenCV平滑图像Smoothing Images

    OpenCV平滑图像Smoothing Images 平滑图像Smoothing Images 目标 理论 归一化框式过滤器 高斯滤波器 中值过滤器 双边过滤器 解释 归一化块过滤器: 高斯滤波器: ...

  4. 数字识别java开源_Java基于opencv实现图像数字识别(三)—灰度化和二值化

    Java基于opencv实现图像数字识别(三)-灰度化和二值化 一.灰度化 灰度化:在RGB模型中,如果R=G=B时,则彩色表示灰度颜色,其中R=G=B的值叫灰度值:因此,灰度图像每个像素点只需一个字 ...

  5. Java基于opencv实现图像数字识别(一),java开发面试笔试题

    我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家. 扫描二维码或搜索下图红色VX号,加VX好友,拉你进[程序员面试学习交流群]免费领取.也欢迎各位一起 ...

  6. 4.3【图像镜像】-------------基于Opencv实现-----图像的镜像变换

     [1]理论知识:         镜像变换又分为水平镜像和垂直镜像,水平镜像即将图像左半部分和右半部分以图像竖直中轴线为中心轴进行兑换,而竖直镜像则是将图像上半部分和下半部分以图像水平中轴线为中 ...

  7. 基于OpenCV实现------图像的转置

    [1]理论基础 图像转置是将图像的x坐标和y坐标互换,图像的大小会随之改变----------即高度和宽度将互换. [2]图像转置的变换公式 因为转置矩阵的逆矩阵仍然是其本身,故转置变换的逆变换具有相 ...

  8. 基于OpenCV实现图像平移

    [1]理论知识 图像平移就是将图像中所有的点按照指定的平移量水平或者垂直移动 [2]完整代码 /*--------------------------------------------------- ...

  9. 基于OpenCV实现图像线性变化

    基础知识: 线性灰度变换函数f(x)是一个一维线性函数 y=f(x)=ax+b 式中:a为线性函数的斜率,b为线性函数在y轴的截距,x表示输入图像的灰度值,y表示输出图像的灰度值. (1) 当a> ...

最新文章

  1. c#.net调用pdf2swf.exe将pdf文件转换为swf,vs中运行正常,布署IIS服务器部署转换后文字部分为空白...
  2. print输出字体特效
  3. C++ string 类常用函数
  4. less加管道tail_linux中cat、more、less、tail、head命令的区别
  5. 华硕笔记本节能证书_新标准兼顾性能与续航 笔记本换代哪些型号值得买?
  6. oracle c#帮助文档下载,C#使用OracleClient连接Oracle数据库小记
  7. asp.net下载的三种方式
  8. 网络爬虫--9.正则表达式
  9. 一道小学数学题引发的“纷争” 产科医生给出解答
  10. 信息学奥赛一本通 1173:阶乘和 | OpenJudge NOI 1.6 15 | 洛谷 P1009 [NOIP1998 普及组] 阶乘之和
  11. CSS和JS两种颜色渐变文字效果代码
  12. (译)响应式图片— srcset 和 sizes 属性
  13. 阶段3 2.Spring_03.Spring的 IOC 和 DI_1 ioc的概念和作用
  14. dBm、mw、dB三者之间的关系
  15. 基于bs4的python爬虫-链家新房(广州页面)
  16. 每天学命令all_inputs
  17. Linux下 unrar unzip 解压
  18. 杰理之IIC及其他配置定义
  19. Wireless Emergency Alerts 介绍(CMAS介绍)
  20. linux怎么撤销关机命令,Linux怎么关机

热门文章

  1. 利用OpenCV实现图像拼接的代码
  2. OpenCV区域提取之利用Rect提取在源代码中预先定义好的区域
  3. xampp访问php显示空白,运行PHP项目显示空白
  4. pyqt5 输入确认_对PyQt5的输入对话框使用(QInputDialog)详解
  5. Windows注册表修改实例完全手册(下)
  6. 阿里一道Java并发面试题 (详细分析篇)
  7. Google 团队效能研究 | 为什么雇用最聪明的人是远远不够的?
  8. 一千行 MySQL 学习笔记,看完就会了
  9. DOM之城市二级联动
  10. 王高利:TCP Wrappers访问控制(hosts.allow,hosts.deny)