python+OpenCV图像处理(六)图像平滑与滤波
图像平滑与滤波
运用它,首先就要了解它,什么是平滑滤波?
平滑滤波是低频增强的空间域滤波技术。它的目的有两类:一类是模糊;另一类是消除噪音。空间域的平滑滤波一般采用简单平均法进行,就是求邻近像元点的平均亮度值。邻域的大小与平滑的效果直接相关,邻域越大平滑的效果越好,但邻域过大,平滑会使边缘信息损失的越大,从而使输出的图像变得模糊,因此需合理选择邻域的大小。
在看一下滤波的目的:
滤波的本义是指信号有各种频率的成分,滤掉不想要的成分,即为滤掉常说的噪声,留下想要的成分.这即是滤波的过程,也是目的。
- 一是抽出对象的特征作为图像识别的特征模式;(在我未来将要进行的一个项目中将会用的到)
- 另一个是为适应图像处理的要求,消除图像数字化时所混入的噪声。
有关平滑与滤波更多的介绍,可以查看百度词条:平滑与滤波
里面有对平滑与滤波详细的解释,我就不一 一介绍了,感谢词条的贡献者,感谢分享,非常感谢。
对于2D图像可以进行低通或者高通滤波操作,低通滤波(LPF)有利于去噪,模糊图像,高通滤波(HPF)有利于找到图像边界。
(一)2D滤波器cv2.filter2D( )
img = cv2.imread('kenan.jpg', 0)
kernel = np.ones((5, 5), np.float32)/25dst = cv2.filter2D(img, -1, kernel)
cv2.imshow('dst', dst)
cv2.imshow('yuantu', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
(二)均值滤波
OpenCV中有一个专门的平均滤波模板供使用------归一化卷积模板,所有的滤波模板都是使卷积框覆盖区域所有像素点与模板相乘后得到的值作为中心像素的值。OpenCV中均值模板可以用cv2.blur和cv2.boxFilter,比如一个3*3的模板其实就可以如下表示;
模板大小m*n是可以设置的。如果不想要前面的1/9,可以使用非归一化模板cv2.boxFitter。
cv2.blur()是一个通用的2D滤波函数,它的使用需要一个核模板。该滤波函数是单通道运算的,
如果是彩色图像,那么需要将彩色图像的各个通道提取出来,然后分别对各个通道滤波。
如果不想使用归一化模板,那么应该使用cv2.boxFilter(), 并且传入参数normalize=False
img = cv2.imread('kenan.jpg', 0)
blur = cv2.blur(img, (3, 5)) # 模板大小为3*5, 模板的大小是可以设定的
box = cv2.boxFilter(img, -1, (3, 5))
cv2.imshow('gray', img)
cv2.imshow('gray_new', blur)
cv2.imshow('gray_new2', box)
cv2.waitKey(0)
cv2.destroyAllWindows()
(三)高斯模糊模板
在上一目录中,我们的卷积模板中的值全是1,现在把卷积模板中的值换一下,不全是1了,换成一组符合高斯分布的数值放在模板里,这时模板中的数值将会中间的数值最大,往两边走越来越小,构造一个小的高斯包。这样可以减少原始图像信息的丢失。
在OpenCV实现的函数为cv2.GaussianBlur()。对于高斯模板,我们需要制定的是高斯核的高和宽(奇数),沿x与y方向的标准差(如果只给x,y=x,如果都给0,那么函数会自己计算)。高斯 核可以有效的去除图像的高斯噪声。当然也可以自己构造高斯核,相关函数为:cv2.GaussianKernel()。
# 高斯模糊模板
img = cv2.imread('kenan.jpg', 0)
for i in range(2000): # 在图像中加入点噪声_x = np.random.randint(0, img.shape[0])_y = np.random.randint(0, img.shape[1])img[_x, _y] = 255
blur = cv2.GaussianBlur(img, (5, 5), 0) # (5,5)表示的是卷积模板的大小,0表示的是沿x与y方向上的标准差
cv2.imshow('img', img)
cv2.imshow('blur', blur)
cv2.waitKey(0)
cv2.destroyAllWindows()
运行结果为:
(四)中值滤波模板
中值滤波模板就是用卷积框中像素的中值代替中心值,达到去噪声的目的。这个模板一般用于去除椒盐噪声。前面的滤波器都是用计算得到的一个新值来取代中心像素的值,而中值滤波是用中心像素周围(也可以使他本身)的值来取代他,卷积核的大小也是个奇数。
# 中值滤波模板
img = cv2.imread('kenan.jpg', 0)
for i in range(2000): # 加入椒盐噪声_x = np.random.randint(0, img.shape[0])_y = np.random.randint(0, img.shape[1])img[_x][_y] = 255
blur = cv2.medianBlur(img, 5) # 中值滤波函数
cv2.imshow('img', img)
cv2.imshow('medianblur_img', blur)
cv2.waitKey(0)
cv2.destroyAllWindows()
结果为:
可以看到,中值滤波对于这些白点噪声的去除,效果是非常好的。
(五)双边滤波
双边滤波(Bilateral filter)是一种可以保证边界清晰的去噪的滤波器。之所以可以达到此去噪声效果,是因为滤波器是由两个函数构成。一个函数是由几何空间距离决定滤波器系数。另一个由像素差决定滤波器系数。它的构造比较复杂,即考虑了图像的空间关系,也考虑图像的灰度关系。双边滤波同时使用了空间高斯权重和灰度相似性高斯权重,确保了边界不会被模糊掉。
cv2.bilateralFilter(img, d, 'p1', 'p2')函数有四个参数需要,d是领域的直径,后面两个参数是空间高斯函数标准差和灰度值相似性高斯函数标准差。
# 双边滤波
img = cv2.imread('rose1.jpg', 0)
for i in range(2000): # 添加椒盐噪声_x = np.random.randint(0, img.shape[0])_y = np.random.randint(0, img.shape[1])img[_x][_y] = 255
# 9表示的是滤波领域直径,后面的两个数字:空间高斯函数标准差,灰度值相似性标准差
blur = cv2.bilateralFilter(img, 9, 80, 80)
cv2.imshow('img', img)
cv2.imshow('blur_img', blur)
cv2.waitKey(0)
cv2.destroyAllWindows()
结果为:
双边滤波函数后面的两个参数设置的越大,图像的去噪越多,但随之而来的是图像ji将变得模糊,所以根据需要调整好后两个参数的大小。
python+OpenCV图像处理(六)图像平滑与滤波相关推荐
- Python+OpenCV图像处理(一篇全)
参考:1.网易云课堂 Python+OpenCV图像处理 - 网易云课堂 2.[在水一方xym的博客]业精于勤荒于嬉,行成于思毁于随 - CSDN博客 https://blog.csdn.net/za ...
- Python+OpenCV图像处理(五)——图像阈值和二值化
系列文章 Python+OpenCV图像处理(一)--OpenCV框架与图像插值算法 Python+OpenCV图像处理(二)--几何变换 Python+OpenCV图像处理(三)--彩色空间互换 P ...
- Python OpenCV图像处理 理论 代码
python opencv图像处理 GitHub - LeBron-Jian/ComputerVisionPractice OpenCV计算机视觉学习 & 代码 OpenCV计算机视觉学习(1 ...
- Python+Opencv图像处理新手入门教程(四):视频内容的读取与导出
一步一步来吧 上一节: Python+Opencv图像处理新手入门教程(三):阈值与二值化 1.Intro 今天这节我们主要看怎么利用opencv读取并处理视频中的内容. 2.VideoCapture ...
- Python+Opencv图像处理新手入门教程(三):阈值与二值化
一步一步来吧 上一节: Python+Opencv图像处理新手入门教程(二):颜色空间转换,图像大小调整,灰度直方图 1.Intro 今天这节我们主要研究利用阈值处理图像.例如对于输入图像: 如何做一 ...
- Python+Opencv图像处理新手入门教程(二):颜色空间转换,图像大小调整,灰度直方图
一步一步来吧 上一节:Python+Opencv图像处理新手入门教程(一):介绍,安装与起步 1.什么是图像 对于计算机而言,图像的本质是一个由像素点构成的矩阵. 例如我们用肉眼很容易分辨一辆汽车的后 ...
- python+opencv图像处理之七:直方图均衡化
python+opencv图像处理之七:直方图均衡化 目录 python+opencv图像处理之七:直方图均衡化 一.直方图均衡化 二.直方图绘制 三.直方图均衡化 四.有限对比适应性直方图均衡化 一 ...
- Python OpenCV 图像处理之直方图的应用,取经之旅第 26 天
Python OpenCV 365 天学习计划,与橡皮擦一起进入图像领域吧. Python OpenCV 基础知识铺垫 cv2.compareHist 函数 橡皮擦的小节 基础知识铺垫 上篇博客 Py ...
- python+opencv图像处理之边缘检测车道线识别
python+opencv图像处理之边缘检测车道线识别 1.自行安装python和opencv 2.导入我们要使用的相关库 import cv2 from matplotlib import pypl ...
最新文章
- P1083 借教室(标记永久化线段树/二分+前缀和)难度⭐⭐⭐★
- java接口关于interface关键字
- 深入理解计算机系统 第十二章 并发编程
- dubbo服务的运行方式
- 18春学期《计算机应用基础》,18春学期(1709、1803)《计算机应用基础》在线作业及答案.pdf...
- 大数据学习笔记38:Hive - 内置函数(1)
- 筛选索引--filter indexs
- Fiddler模拟请求报文
- php 调用永中云,永中优云:是时候给大家介绍真正的云端Office了
- jquery 同胞 siblings next nextAll nextUtil pre preAll preUtil
- 倾角传感器的介绍和应用
- 数据科学 IPython 笔记本 四、Keras(下)
- 快递物流行业总结(一)中国快递行业生命周期理论
- Python“Non-ASCII character 'xe5' in file”报错问题
- python中pd是什么意思_python pd
- laragon yii
- 走进梦龙冰淇淋的生产线 揭晓“灯塔工厂”背后的秘密
- 彩虹商城知识付费程序-优质站,易支付可自定义(货源对接)
- 50行代码教你打造一个公众号文章采集器
- 前端Vue.js框架是什么?有哪些特点?
热门文章
- 2018最新阿里Java技术三面(已拿Offer):JVM+高并发性能+单点登录+微服务
- 会议交流 | 如何将图谱实体与关系更好的向量化,并基于推理扩充知识边界?——DataFun Summit2022知识图谱在线峰会...
- 可扩展的TextView,ExpandableTextView与Scroller类的使用
- Hadoop 命令操作
- 09.MyBatis的逆向工程
- GB28181开放流媒体服务平台LiveGBS实际测试时问题排查
- js实现svg图形转存为图片下载
- 移植memtester到android平台
- 关系数据库SQL之可编程性触发器
- 怎么改变asp.net中.sln文件的默认生成路径