OpenCV--模糊图像操作
模糊操作时图像处理中最简单和常用的操作之一,使用该操作的原因之一就为了给图像预处理时减低噪声。
使用模糊操作的背后是数学的卷积计算:
其中权重核 h(k,l) h(k,l)为“滤波系数”。上面的式子可以简记为:
通常这些卷积算子计算都是线性操作,所以又叫线性滤波。
均值滤波(归一化滤波)
均值滤波是典型的线性滤波算法,它是指在图像上对目标像素给一个模板,该模板包括了其周围的临近像素(以目标像素为中心的周围8个像素,构成一个滤波模板,即去掉目标像素本身),再用模板中的全体像素的平均值来代替原来像素值。
用 3×3 大小模板进行均值滤波。
由于图像边框上的像素无法被模板覆盖,所以不做处理。
这当然造成了图像边缘的缺失
以(2,2)像素点为例。
则滤波后的结果为:
滤波后(2,2)像素点的值由 10 变为 3
最终结果:
OpenCV提供均值滤波API:
void blur(Mat src,Mat dst, Size(xradius,yradius), Point(-1, -1))
实例代码:
//均值滤波
void Averblur(){Mat src,dest;src = imread("lena_noise.jpg");//对带椒盐噪声的图片进行处理if(!src.data){cout << "图像载入失败!" << endl;return ;}namedWindow("均值滤波【原图】",CV_WINDOW_AUTOSIZE);imshow("均值滤波【原图】",src);//进行均值滤波blur(src,dest,Size(11,11));namedWindow("均值滤波【处理后】",CV_WINDOW_AUTOSIZE);imshow("均值滤波【处理后】",dest);cvWaitKey();}
效果图:
对于椒盐噪声:
对于高斯噪声:
中值滤波
中值,中间值,将数据从小到大排序后的中间值
用 3×3 大小模板进行中值滤波。
以(2,2)像素点为例。
对模板中的 9 个数进行从小到大排序:1,1,1,2,2,5,6,6,10。中间值为 2.所有,中值滤波后(2,2)位置的值变为 2. 同理对其他像素点。
处理结果:
OpenCV提供中值滤波API:
void medianBlur(InputArray src, OutputArray dst, int ksize)
实例代码:
//中值滤波
void Medianblur(){//void medianBlur(InputArray src, OutputArray dst, int ksize)/*ksize:必须大于1还是奇数*/Mat src,dest;src = imread("lena_noise.jpg");if(!src.data){cout << "图像载入失败!" << endl;return ;}namedWindow("中值滤波【原图】",CV_WINDOW_AUTOSIZE);imshow("中值滤波【原图】",src);//进行中值滤波medianBlur(src,dest,3);namedWindow("中值滤波【处理后】",CV_WINDOW_AUTOSIZE);imshow("中值滤波【处理后】",dest);cvWaitKey();
}
处理结果:
对于椒盐噪声:
对于高斯噪声
中值滤波对于椒盐噪声抑制作用较强,但是对于高斯噪声就无能为力了!
高斯滤波
高斯滤波是一种线性平滑滤波,适用于消除高斯噪声,广泛应用于图像处理的减噪过程。通俗的讲,高斯滤波就是对整幅图像进行加权平均的过程,每一个像素点的值,都由其本身和邻域内的其他像素值经过加权平均后得到。高斯滤波的具体操作是:用一个模板(或称卷积、掩模)扫描图像中的每一个像素,用模板确定的邻域内像素的加权平均灰度值去替代模板中心像素点的值。
OpenCV提供API:
void GaussianBlur(InputArray src, OutputArray dst, Size ksize, double sigmaX, double sigmaY=0, int borderType=BORDER_DEFAULT )
实例代码:
void Gaussianblur(){//Mat src,dest;src = imread("lena_noise2.jpg");if(!src.data){cout << "图像载入失败!" << endl;return ;}namedWindow("高斯滤波【原图】",CV_WINDOW_AUTOSIZE);imshow("高斯滤波【原图】",src);//进行高斯滤波GaussianBlur(src,dest,Size(7,7),3,3);namedWindow("高斯滤波【处理后】",CV_WINDOW_AUTOSIZE);imshow("高斯滤波【处理后】",dest);cvWaitKey();
}
处理结果:
双边滤波
- 均值模糊无法克服边缘像素信息丢失缺陷。原因是均值模糊是基于平均权重。
- 高斯模糊部分克服了该缺陷,但是无法完全避免,因为没考虑到像素值的不同。
- 双边滤波是保留边缘的滤波方法,避免了边缘信息的丢失,保留了图像轮廓不变。
OpenCV提供的API:
void bilateralFilter(InputArray src, OutputArray dst, int d, double sigmaColor, double sigmaSpace, int borderType=BORDER_DEFAULT )
实例代码:
//双边滤波
void Bilaterblur(){//void bilateralFilter(InputArray src, OutputArray dst, int d, double sigmaColor, double sigmaSpace, int borderType=BORDER_DEFAULT )/*d:计算的半径sigmaColor:多少差值之内的像素会被计算sigmaSpace:如果d>0,那么声明无效,否则根据它来计算d值*/Mat src,dest;src = imread("woman.jpg");if(!src.data){cout << "图像载入失败!" << endl;return ;}namedWindow("双边滤波【原图】",CV_WINDOW_AUTOSIZE);imshow("双边滤波【原图】",src);//进行双边滤波bilateralFilter(src,dest,15,150,3);namedWindow("双边滤波【处理后】",CV_WINDOW_AUTOSIZE);imshow("双边滤波【处理后】",dest);//增强对比度Mat result = Mat::zeros(dest.size(),dest.type());Mat kernel = (Mat_<char>(3,3)<<0,-1,0,-1,5,-1,0,-1,0);filter2D(dest,result,dest.depth(),kernel);namedWindow("最终结果",CV_WINDOW_AUTOSIZE);imshow("最终结果",result);cvWaitKey();
}
最终结果:
使用双边滤波后再使用掩膜增强对比度,这效果。杠杠滴!!
OpenCV--模糊图像操作相关推荐
- Python OpenCV像素操作
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自:opencv学堂 Python OpenCV像素操作 环 ...
- opencv鼠标操作,画矩形
opencv鼠标操作,画矩形 效果图 主要两个函数在作用 //-------------------全局函数声明部分------------------------- //描述:全局函数的声明 //- ...
- OpenCV图像操作的实例(附完整代码)
OpenCV图像操作的实例 OpenCV图像操作的实例 OpenCV图像操作的实例 #include "opencv2/core.hpp" #include "openc ...
- OpenCV图像操作
OpenCV图像操作 OpenCV图像操作 输入输出 图片 图像的基本操作 访问像素强度值 内存管理和引用计数 原始操作 可视化图像 OpenCV图像操作 输入输出 图片 C ++ 从文件加载图像: ...
- OpenCV形态学操作
OpenCV形态学操作 本文转载自:http://blog.csdn.net/byxdaz/article/details/5775717 一.图像腐蚀 膨胀 细化的基本原理 1.图像细化的基本原 ...
- openCV视频操作(C++版本)
openCV视频操作(C++版本) VideoCapture类详解 opencv的视频操作主要用到 VideoCapture类,有三个构造函数: VideoCapture::VideoCapture( ...
- C++ OpenCV视频操作之图像输出文字
前言 当我们视频分析时可能图像中需要有一个文字说明,OpenCV中本身也有这个API,我们就来看看OpenCV中的图像文字输出. 视频效果 函数API void putText( Mat& i ...
- OpenCV 形态学操作之腐蚀与膨胀,开运算与闭运算,顶帽与黑帽,图像梯度运算相关知识点回顾
Python OpenCV 365 天学习计划,与橡皮擦一起进入图像领域吧.本篇博客是这个系列的第 45 篇. 该系列文章导航参考:https://blog.csdn.net/hihell/categ ...
- opencv 图像操作,常用 OpenCV 内置函数
OpenCV 如何对图像的像素进行操作 对图像的像素进行操作,我们可以实现空间增强,反色,大部分图像特效系列都是基于像素操作等目的.先来看一下内存空间中图像矩阵,也就是Mat的矩阵数值部分是怎么存储的 ...
- 15、OpenCV形态学操作——Hit-or-Miss
OpenCV形态学操作--Hit-or-Miss 一.学习目标 二.Hit-or-Miss 一.学习目标 理解什么是Hit-or-Miss 学会在OpenCV中使用Hit-or-Miss 二.Hit- ...
最新文章
- jsp中空格字符怎么写_驰骋职场多年,如何对付Excel中的空格字符?
- 后端返回html标签到前端,后端返回的HTML代码字符串怎么能自动渲染到前端页面...
- python从入门到放弃图片大全-Python 从入门到放弃(一)
- mysql连接报错Access denied for user ‘root‘@‘localhost‘
- python应用实战案例:python如何实现异步爬虫?
- Gdiplus byte *数据转换为Bitmap类型图片
- Android蓝牙无法通信,android.bluetooth.BluetoothSocket无法连接
- js json制表符报错_JS自学_常见错误复盘
- implicit request ?
- 自主可控的全数字实时仿真软件SkyEye支持PowerPC指令级仿真
- socket 编程原理1
- Python 资源库大全
- 10个不太为人所知的,但实用的PHP函数(转)
- 数据库事务复制(读写分离)设计的一点经验
- Atitit 命令行执行springboot程序 目录 1.1. 执行spel表达式,调用app main,获取context	1 1.2. 直接在Application main函数内执行	1
- SAM2195和SAM2695 和SAM5704硬音源设备在三四十年前MIDI技术刚刚起步之时
- 传智播客风清扬视频-------线程简介2
- axis2之webservice
- python 基于Tkinter的姻缘测试器
- 关于Jmeter中的函数和变量用法
热门文章
- JS 中的 assign 方法究竟是 “深克隆” 还是 “浅克隆”?
- 编一程序,将星期一。。。。星期六英文输出
- 滴滴如何调度_滴滴研究院:解读滴滴调度系统中的人工智能
- keepalived启动不成功,状态一直是inactive(dead) 的解决办法以及keepalived高版本没有rc.d目录,虚拟VIP无法访问问题...
- win7备份工具_电脑备份系统详细图文教程
- PL/SQL 九九乘法表
- Vmware 与主机之间传输文件
- 如何提高自己的写作能力
- 剖析冲击式破碎机破碎矿石和解离纤维
- 程序员如何进行职业规划---未雨绸缪