欢迎大家来到“Python从零到壹”,在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界。所有文章都将结合案例、代码和作者的经验讲解,真心想把自己近十年的编程经验分享给大家,希望对您有所帮助,文章中不足之处也请海涵。Python系列整体框架包括基础语法10篇、网络爬虫30篇、可视化分析10篇、机器学习20篇、大数据分析20篇、图像识别30篇、人工智能40篇、Python安全20篇、其他技巧10篇。您的关注、点赞和转发就是对秀璋最大的支持,知识无价人有情,希望我们都能在人生路上开心快乐、共同成长。
该系列文章主要讲解Python OpenCV图像处理和图像识别知识,前期主要讲解图像处理基础知识、OpenCV基础用法、常用图像绘制方法、图像几何变换等,中期讲解图像处理的各种运算,包括图像点运算、形态学处理、图像锐化、图像增强、图像平滑等,后期研究图像识别、图像分割、图像分类、图像特效处理以及图像处理相关应用。
第二部分将讲解图像运算和图像增强,上一篇文章介绍图像平滑知识,包括均值滤波、方框滤波和高斯滤波。这篇文章将继续讲解图像平滑知识,包括中值滤波和双边滤波。常用于消除噪声的图像平滑方法包括三种线性滤波(均值滤波、方框滤波、高斯滤波)和两种非线性滤波(中值滤波、双边滤波),本文将详细讲解两种非线性滤波方法。希望文章对您有所帮助,如果有不足之处,还请海涵。
[Python从零到壹] 十三.机器学习之聚类分析万字总结全网首发(K-Means、BIRCH、层次聚类、树状聚类)
[Python从零到壹] 十四.机器学习之分类算法五万字总结全网首发(决策树、KNN、SVM、分类对比实验)
[Python从零到壹] 十五.文本挖掘之数据预处理、Jieba工具和文本聚类万字详解
[Python从零到壹] 十六.文本挖掘之词云热点与LDA主题分布分析万字详解
[Python从零到壹] 十七.可视化分析之Matplotlib、Pandas、Echarts入门万字详解
[Python从零到壹] 十八.可视化分析之Basemap地图包入门详解
[Python从零到壹] 十九.可视化分析之热力图和箱图绘制及应用详解
[Python从零到壹] 二十.可视化分析之Seaborn绘图万字详解
[Python从零到壹] 二十一.可视化分析之Pyechart绘图万字详解
[Python从零到壹] 二十二.可视化分析之OpenGL绘图万字详解
[Python从零到壹] 二十三.十大机器学习算法之决策树分类分析详解(1)
[Python从零到壹] 二十四.十大机器学习算法之KMeans聚类分析详解(2)
[Python从零到壹] 二十五.十大机器学习算法之KNN算法及图像分类详解(3)
[Python从零到壹] 二十六.十大机器学习算法之朴素贝叶斯算法及文本分类详解(4)
[Python从零到壹] 二十七.十大机器学习算法之线性回归算法分析详解(5)
[Python从零到壹] 二十八.十大机器学习算法之SVM算法分析详解(6)
[Python从零到壹] 二十九.十大机器学习算法之随机森林算法分析详解(7)
[Python从零到壹] 三十.十大机器学习算法之逻辑回归算法及恶意请求检测应用详解(8)
[Python从零到壹] 三十一.十大机器学习算法之Boosting和AdaBoost应用详解(9)
[Python从零到壹] 三十二.十大机器学习算法之层次聚类和树状图聚类应用详解(10)
第四部分 Python图像处理基础
[Python从零到壹] 三十三.图像处理基础篇之什么是图像处理和OpenCV配置
[Python从零到壹] 三十四.OpenCV入门详解——显示读取修改及保存图像
[Python从零到壹] 三十五.图像处理基础篇之OpenCV绘制各类几何图形
[Python从零到壹] 三十六.图像处理基础篇之图像算术与逻辑运算详解
[Python从零到壹] 三十七.图像处理基础篇之图像融合处理和ROI区域绘制
[Python从零到壹] 三十八.图像处理基础篇之图像几何变换(平移缩放旋转)
[Python从零到壹] 三十九.图像处理基础篇之图像几何变换(镜像仿射透视)
[Python从零到壹] 四十.图像处理基础篇之图像量化处理
[Python从零到壹] 四十一.图像处理基础篇之图像采样处理
[Python从零到壹] 四十二.图像处理基础篇之图像金字塔向上取样和向下取样
[Python从零到壹] 四十三.图像增强及运算篇之图像点运算和图像灰度化处理
[Python从零到壹] 四十四.图像增强及运算篇之图像灰度线性变换详解
[Python从零到壹] 四十五.图像增强及运算篇之图像灰度非线性变换详解
[Python从零到壹] 四十六.图像增强及运算篇之图像阈值化处理
[Python从零到壹] 四十七.图像增强及运算篇之腐蚀和膨胀详解
[Python从零到壹] 四十八.图像增强及运算篇之形态学开运算、闭运算和梯度运算
[Python从零到壹] 四十九.图像增强及运算篇之顶帽运算和底帽运算
[Python从零到壹] 五十.图像增强及运算篇之图像直方图理论知识和绘制实现
[Python从零到壹] 五十一.图像增强及运算篇之图像灰度直方图对比分析万字详解
[Python从零到壹] 五十二.图像增强及运算篇之图像掩膜直方图和HS直方图
[Python从零到壹] 五十三.图像增强及运算篇之直方图均衡化处理
[Python从零到壹] 五十四.图像增强及运算篇之局部直方图均衡化和自动色彩均衡化处理
[Python从零到壹] 五十五.图像增强及运算篇之图像平滑(均值滤波、方框滤波、高斯滤波)
[Python从零到壹] 五十六.图像增强及运算篇之图像平滑(中值滤波、双边滤波)
第六部分 Python图像识别和图像高阶案例
第七部分 NLP与文本挖掘
第八部分 人工智能入门知识
第九部分 网络攻防与AI安全
第十部分 知识图谱构建实战
扩展部分 人工智能高级案例
前面讲述的都是线性平滑滤波,它们的中间像素值都是由邻域像素值线性加权得到的,接下来将讲解一种非线性平滑滤波——中值滤波。中值滤波通过计算每一个像素点某邻域范围内所有像素点灰度值的中值,来替换该像素点的灰度值,从而让周围的像素值更接近真实情况,消除孤立的噪声。
中值滤波对脉冲噪声有良好的滤除作用,特别是在滤除噪声的同时,能够保护图像的边缘和细节,使之不被模糊处理,这些优良特性是线性滤波方法所不具有的,从而使其常常被应用于消除图像中的椒盐噪声[1-2]。
中值滤波算法的计算过程如图1所示。选择含有五个点的窗口,依次扫描该窗口中的像素,每个像素点所对应的灰度值按照升序或降序排列,然后获取最中间的值来替换该点的灰度值。
上图展示的是矩形窗口,常用的窗口还包括正方形、十字形、环形和圆形等,不同形状的窗口会带来不同的过滤效果,其中正方形和圆形窗口适合于外轮廓边缘较长的图像,十字形窗口适合于带尖角形状的图像。
OpenCV将中值滤波封装在medianBlur()函数中,其函数原型如下所示:
dst = medianBlur(src, ksize[, dst])
– src表示待处理的输入图像
– dst表示输出图像,其大小和类型与输入图像相同
– ksize表示内核大小,其值必须是大于1的奇数,如3、5、7等
下面是调用medianBlur()函数实现中值滤波的代码。
# -*- coding: utf-8 -*-
# By:Eastmount
import cv2
import numpy as np
import matplotlib.pyplot as plt
#读取图片
img = cv2.imread('lena-zs.png')
source = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
#中值滤波
result = cv2.medianBlur(source, 3)
#用来正常显示中文标签
plt.rcParams['font.sans-serif']=['SimHei']
#显示图形
titles = ['原始图像', '中值滤波']
images = [source, result]
for i in range(2):
plt.subplot(1,2,i+1), plt.imshow(images[i], 'gray')
plt.title(titles[i])
plt.xticks([]),plt.yticks([])
plt.show()
其运行结果如图2所示,它有效地过滤掉了“lena”图中的噪声,并且很好地保护了图像的边缘信息,使之不被模糊处理。
双边滤波(Bilateral filter)是由Tomasi和Manduchi在1998年发明的一种各向异性滤波,它一种非线性的图像平滑方法,结合了图像的空间邻近度和像素值相似度(即空间域和值域)的一种折中处理,从而达到保边去噪的目的。双边滤波的优势是能够做到边缘的保护,其他的均值滤波、方框滤波和高斯滤波在去除噪声的同时,都会有较明显的边缘模糊,对于图像高频细节的保护效果并不好[3]。
双边滤波比高斯滤波多了一个高斯方差sigma-d,它是基于空间分布的高斯滤波函数。所以在图像边缘附近,离的较远的像素点不会过于影响到图像边缘上的像素点,从而保证了图像边缘附近的像素值得以保存。但是双边滤波也存在一定的缺陷,由于它保存了过多的高频信息,双边滤波不能有效地过滤掉彩色图像中的高频噪声,只能够对低频信息进行较好地去噪[4]。
在双边滤波器中,输出的像素值依赖于邻域像素值的加权值组合,对输入图像进行局部加权平均得到输出图像 的像素值,其公式如下所示:
从式子(4)可以看出,双边滤波器的加权系数是空间邻近度因子和像素亮度相似因子的非线性组合。前者随着像素点与中心点之间欧几里德距离的增加而减小,后者随着像素亮度之差的增大而减小[5-6]。
在图像变化平缓的区域,邻域内亮度值相差不大,双边滤波器转化为高斯低通滤波器;在图像变化剧烈的区域,邻域内像素亮度值相差较大,滤波器利用边缘点附近亮度值相近的像素点的亮度平均值替代原亮度值。因此,双边滤波器既平滑了图像,又保持了图像边缘,其原理图如图3所示。
dst = bilateralFilter(src, d, sigmaColor, sigmaSpace[, dst[, borderType]])
– src表示待处理的输入图像
– dst表示输出图像,其大小和类型与输入图像相同
– d表示在过滤期间使用的每个像素邻域的直径。如果这个值我们设其为非正数,则它会由sigmaSpace计算得出
– sigmaColor表示颜色空间的标准方差。该值越大,表明像素邻域内较远的颜色会混合在一起,从而产生更大面积的半相等颜色区域
– sigmaSpace表示坐标空间的标准方差。该值越大,表明像素的颜色足够接近,从而使得越远的像素会相互影响,更大的区域中相似的颜色获取相同的颜色,当d>0,d指定了邻域大小且与sigmaSpace无关。否则,d正比于sigmaSpace
– borderType表示边框模式,用于推断图像外部像素的某种边界模式,默认值为BORDER_DEFAULT,可省略
下面是调用bilateralFilter()函数实现双边滤波的代码,其中d为15,sigmaColor设置为150,sigmaSpace设置为150。
# -*- coding: utf-8 -*-
# By:Eastmount
import cv2
import numpy as np
import matplotlib.pyplot as plt
#读取图片
img = cv2.imread('lena-zs.png')
source = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
#双边滤波
result = cv2.bilateralFilter(source, 15, 150, 150)
#用来正常显示中文标签
plt.rcParams['font.sans-serif']=['SimHei']
#显示图形
titles = ['原始图像', '双边滤波']
images = [source, result]
for i in range(2):
plt.subplot(1,2,i+1), plt.imshow(images[i], 'gray')
plt.title(titles[i])
plt.xticks([]),plt.yticks([])
plt.show()
其运行结果如图4所示:
本文主要讲解了常用于消除噪声的图像平滑方法,常见方法包括三种线性滤波(均值滤波、方框滤波、高斯滤波)和两种非线性滤波(中值滤波、双边滤波)。这篇文章介绍了中值滤波和双边滤波,通过原理和代码进行对比,分别讲述了各种滤波方法的优缺点,有效地消除了图像的噪声,并保留图像的边缘轮廓。
感谢在求学路上的同行者,不负遇见,勿忘初心。作者在华为云社区开放了Python图像处理系列书籍,图像处理系列主要包括三部分,分别是:
[1] 冈萨雷斯著,阮秋琦译. 数字图像处理(第3版)[M]. 北京:电子工业出版社,2013.
[2] 阮秋琦. 数字图像处理学(第3版)[M]. 北京:电子工业出版社,2008.
[3] 陈初侠. 图像滤波及边缘检测与增强技术研究[D].合肥工业大学, 2009.
[4] Eastmount. [Python图像处理] 四.图像平滑之均值滤波、方框滤波、高斯滤波及中值滤波[EB/OL]. (2018-09-02). https://blog.csdn.net/Eastmount/article/details/82216380.
[5] Eastmount. [数字图像处理] 七.MFC图像增强之图像普通平滑、高斯平滑、Laplacian、Sobel、Prewitt锐化详解[EB/OL]. (2015-06-08). https://blog.csdn.net/eastmount/article/ details/46378783.
[6] 毛星云. [OpenCV入门教程之九] 非线性滤波专场:中值滤波、双边滤波[EB/OL]. (2014-04-08). https://blog.csdn.net/poem_qianmo/article/details/23184547.
[7] C. Tomasi, R Manduchi. Bilateral Filtering for Gray and Color images[C]. Proceedings of the IEEE International Conference on Computer Vision, Bombay, India. 1998:839-846.
【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
[email protected]