又是一年1024,首先,祝大家节日快乐!
欢迎大家来到“Python从零到壹”,在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界。所有文章都将结合案例、代码和作者的经验讲解,真心想把自己近十年的编程经验分享给大家,希望对您有所帮助,文章中不足之处也请海涵。Python系列整体框架包括基础语法10篇、网络爬虫30篇、可视化分析10篇、机器学习20篇、大数据分析20篇、图像识别30篇、人工智能40篇、Python安全20篇、其他技巧10篇。您的关注、点赞和转发就是对秀璋最大的支持,知识无价人有情,希望我们都能在人生路上开心快乐、共同成长。
该系列文章主要讲解Python OpenCV图像处理和图像识别知识,前期主要讲解图像处理基础知识、OpenCV基础用法、常用图像绘制方法、图像几何变换等,中期讲解图像处理的各种运算,包括图像点运算、形态学处理、图像锐化、图像增强、图像平滑等,后期研究图像识别、图像分割、图像分类、图像特效处理以及图像处理相关应用。
第二部分将讲解图像运算和图像增强,上一篇文章介绍图像增强知识,包括直方图均衡化、局部直方图均衡化、自动色彩均衡化。这篇文章将详细讲解图像平滑知识,包括均值滤波、方框滤波和高斯滤波。常用于消除噪声的图像平滑方法包括三种线性滤波(均值滤波、方框滤波、高斯滤波)和两种非线性滤波(中值滤波、双边滤波),本文将详细讲解三种线性滤波方法。希望文章对您有所帮助,如果有不足之处,还请海涵。
下载地址:记得点赞喔 O(∩_∩)O
- https://github.com/eastmountyxz/Python-zero2one
- 开源600多页电子书:https://github.com/eastmountyxz/HWCloudImageRecognition
前文赏析:
第一部分 基础语法
- [Python从零到壹] 一.为什么我们要学Python及基础语法详解
- [Python从零到壹] 二.语法基础之条件语句、循环语句和函数
- [Python从零到壹] 三.语法基础之文件操作、CSV文件读写及面向对象
第二部分 网络爬虫
- [Python从零到壹] 四.网络爬虫之入门基础及正则表达式抓取博客案例
- [Python从零到壹] 五.网络爬虫之BeautifulSoup基础语法万字详解
- [Python从零到壹] 六.网络爬虫之BeautifulSoup爬取豆瓣TOP250电影详解
- [Python从零到壹] 七.网络爬虫之Requests爬取豆瓣电影TOP250及CSV存储
- [Python从零到壹] 八.数据库之MySQL基础知识及操作万字详解
- [Python从零到壹] 九.网络爬虫之Selenium基础技术万字详解(定位元素、常用方法、键盘鼠标操作)
- [Python从零到壹] 十.网络爬虫之Selenium爬取在线百科知识万字详解(NLP语料构造必备技能)
第三部分 数据分析和机器学习
- [Python从零到壹] 十一.数据分析之Numpy、Pandas、Matplotlib和Sklearn入门知识万字详解(1)
- [Python从零到壹] 十二.机器学习之回归分析万字总结全网首发(线性回归、多项式回归、逻辑回归)
- [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从零到壹] 五十一.图像增强及运算篇之图像灰度直方图对比分析万字详解
- [Python从零到壹] 五十二.图像增强及运算篇之图像掩膜直方图和HS直方图
- [Python从零到壹] 五十三.图像增强及运算篇之直方图均衡化处理
- [Python从零到壹] 五十四.图像增强及运算篇之局部直方图均衡化和自动色彩均衡化处理
- [Python从零到壹] 五十五.图像增强及运算篇之图像平滑(均值滤波、方框滤波、高斯滤波)
第六部分 Python图像识别和图像高阶案例
第七部分 NLP与文本挖掘
第八部分 人工智能入门知识
第九部分 网络攻防与AI安全
第十部分 知识图谱构建实战
扩展部分 人工智能高级案例
作者新开的“娜璋AI安全之家”将专注于Python和安全技术,主要分享Web渗透、系统安全、人工智能、大数据分析、图像识别、恶意代码检测、CVE复现、威胁情报分析等文章。虽然作者是一名技术小白,但会保证每一篇文章都会很用心地撰写,希望这些基础性文章对你有所帮助,在Python和安全路上与大家一起进步。
一.图像平滑
图像平滑是一项简单且使用频率很高的图像处理方法,可以用来压制、弱化或消除图像中的细节、突变、边缘和噪声,最常见的是用来减少图像上的噪声[1]。何为图像噪声?噪声是妨碍人的感觉器官所接受信源信息理解的因素,是不可预测只能用概率统计方法认识的随机误差。从图1中,可以观察到噪声的特点:位置随机、大小不规则,将这种噪声称为随机噪声,这是一种常见的噪声类型。
图2是一个图像平滑的示例,图中左半部分是包含噪声的原始输入图像,右半部分是进行图像平滑后的图像。通过对比容易观察到,在平滑后的图像中,物体中的噪声得到了有效地抑制和消除,但花的边缘部分被进行了模糊,这种将图像中的冗余信息进行抑制,即花的噪声进行消除的过程被称为图像平滑[2]。
一幅图像不可避免地要受到各种噪声源的干扰,所以噪声滤除往往是图像处理中的第一步,滤波效果好坏将直接影响后续处理结果,噪声滤除在图像处理中占有相当重要的地位。噪声滤除算法多种多样,可以从设计方法上分为线性滤波算法和非线性滤波算法两大类。
(1)线性滤波
在图像处理中,对邻域中的像素的计算为线性运算时,如利用窗口函数进行平滑加权求和的运算,或者某种卷积运算,都可以称为线性滤波。在数字信号处理和数字图像处理的早期研究中,线性滤波器是噪声抑制处理的主要手段,如均值滤波、方框滤波、高斯滤波等。
线性滤波算法对高斯型噪声有较好的滤波效果,而当信号频谱与噪声频谱混叠时或者当信号中含有非叠加性噪声时(例如由系统非线性引起的噪声或存在非高斯噪声等),线性滤波器的处理结果就很难令人满意。
(2)非线性滤波
非线性滤波利用原始图像跟模版之间的一种逻辑关系得到结果,如中值滤波、双边滤波等。非线性滤波技术从某种程度上弥补了线性滤波方法的不足,由于它能够在滤除噪声的同时较好地保持图像信号的高频细节,从而得到广泛的应用。著名学者 Tukey [3]于1971年首次提出了一种非线性滤波器——中值滤波器,从此揭开了非线性滤波方法研究的序幕。非线性滤波技术发展到现在,基于中值滤波的改进算法层出不穷,在非线性滤波算法中占有重要的地位。另外很多新的非线性滤波算法也相继涌现,如基于数学形态学的滤波方法、基于模糊理论的滤波方法、基于神经网络的滤波方法等,它们为图像滤波技术提供新的思路[4-5]。
后文将详细介绍以下常用的一些滤波器,包括均值滤波、方框滤波、高斯吕波、中值滤波等,如表23-1所示。
图3为这五种滤波的效果对比,从滤波的结果可以看出各种滤波算法对图像的作用非常不同,有些变化非常大,有些甚至跟原图一样。在实际应用时,应根据噪声的特点、期望的图像和边缘特征等来选择合适的滤波器,这样才能发挥图像滤波的最大优点。
在图像产生、传输和复制过程中,常常会因为多方面原因而被噪声干扰或出现数据丢失,降低了图像的质量。这就需要对图像进行一定的增强处理以减小这些缺陷带来的影响[6]。
二.均值滤波
均值滤波是最简单的一种线性滤波算法,它是指在原始图像上对目标像素给一个模板,该模板包括了其周围的临近像素(以目标像素为中心的周围8个像素,构成一个滤波模板,即去掉目标像素本身),再用模板中的全体像素的平均值来代替原来的像素值。换句话说,均值滤波输出图像的每一个像素值是其周围M×M个像素值的加权平均值。
图4表示均值滤波处理的过程,中心红色点的像素值为蓝色背景区域像素值求和的均值。5×5的矩阵称之为模糊内核,针对原始图像内的像素点,均值滤波采用核对其像素逐个进行均值处理,并得到最终的效果图。
其中红色区域的像素值均值滤波处理过程为:
均值滤波算法比较简单,计算速度较快,对周期性的干扰噪声有很好的抑制作用,但是它不能很好地保护图像的细节,在图像去噪的同时,也破坏了图像的细节部分,从而使图像变得模糊。
Python调用OpenCV中的cv2.blur()函数实现均值滤波处理,其函数原型如下所示,输出的dst图像与输入图像src具有相同的大小和类型。
dst = blur(src, ksize[, dst[, anchor[, borderType]]])
- src表示输入图像,它可以有任意数量的通道,但深度应为CV_8U、CV_16U、CV_16S、CV_32F或CV_64F
- ksize表示模糊内核大小,以(宽度,高度)的形式呈现
- anchor表示锚点,即被平滑的那个点,其默认值Point(-1,-1)表示位于内核的中央,可省略
- borderType表示边框模式,用于推断图像外部像素的某种边界模式,默认值为BORDER_DEFAULT,可省略
常见的模糊内核包括(3,3)和(5,5),如公式(2)和(3)所示:
图像均值滤波的Python实现代码如下所示,需要注意的是,代码中使用的是3×3的模板,plt.rcParams是用于设置中文汉字正常显示。
# -*- 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.blur(source, (3,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()
“lena”图输出结果如图5所示,左边表示含有噪声的待处理原图,右边是均值滤波处理后的图像,图像中的椒盐噪声被去除了。
如果图像中的噪声仍然存在,可以增加模糊内核的大小,比如使用5×5、10×10,甚至20×20的模板。图6就是使用10×10的内核,但是处理后的图像会逐渐变得更模糊。
图像均值滤波是通过模糊内核对图像进行平滑处理,由于模糊内核中的每个权重值都相同,故称为均值。该方法在一定程度上消除了原始图像中的噪声,降低了原始图像的对比度,但也存在一定缺陷,它在降低噪声的同时使图像变得模糊,尤其是边缘和细节处,而且模糊内核越大,模糊程度越严重。
三.方框滤波
图像平滑利用卷积模板逐一处理图像中每个像素,这一过程可以形象地比作对原始图像的像素进行过滤整理,把邻域像素逐一处理的算法过程称为滤波器。常见的线性滤波器包括均值滤波和方框滤波。
方框滤波又称为盒式滤波,它利用卷积运算对图像邻域的像素值进行平均处理,从而实现消除图像中的噪声。方框滤波和和均值滤波的模糊内核基本一样,区别为是否需要进行均一化处理。
Python调用OpenCV中的cv2.boxFilter()函数实现方框滤波处理,其函数原型如下所示:
dst = boxFilter(src, depth, ksize[, dst[, anchor[, normalize[, borderType]]]])
- src表示输入图像
- dst表示输出图像,其大小和类型与输入图像相同
- depth表示输出图像深度,通常设置为“-1”,表示与原图深度一致
- ksize表示模糊内核大小,以(宽度,高度)的形式呈现
- normalize表示是否对目标图像进行归一化处理,默认值为true
- anchor表示锚点,即被平滑的那个点,其默认值Point(-1,-1)表示位于内核的中央,可省略
- borderType表示边框模式,用于推断图像外部像素的某种边界模式,默认值为BORDER_DEFAULT,可省略
常见的模糊内核ksize包括(3,3)和(5,5),如下所示:
参数normalize表示是否对目标图像进行归一化处理。
- (1)当normalize为true时,需要执行归一化处理,方框滤波就变成了均值滤波。其中,归一化就是把要处理的像素值都缩放到一个范围内,以便统一处理和直观量化。
- (2)当normalize为false时,表示非归一化的方框滤波,不进行均值化处理,实际上就是求周围各像素的和。但此时很容易发生溢出,多个像素值相加后的像素值大于255,溢出后的像素值均设置为255,即白色。
参数normalize的定义如公式(6)所示。
图像方框滤波的Python实现代码如下所示,代码中使用3×3的核,normalize=0表示不进行图像归一化处理。
# -*- 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.boxFilter(source, -1, (3,3), normalize=0)
#用来正常显示中文标签
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()
方框滤波非归一化处理的输出结果如图7所示,处理后的效果图中包含很多白色的像素点,这是因为图像像素求和结果发生溢出(超过255)。由此可见,进行非归一化的处理时,得到的图像包含白色过多,对源图像的毁坏太大。
如果设置2×2的模糊内核,其非归一化的方框滤波处理效果更好一些,如图23-8所示。核心代码为:
- cv2.boxFilter(source, -1, (2,2), normalize=0)
下面代码是使用3×3内核,进行归一化方框滤波处理的代码,其输出结果与3×3内核均值滤波完全相同。
# -*- 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.boxFilter(source, -1, (3,3), normalize=1)
#用来正常显示中文标签
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()
输出结果如图9所示:
四.高斯滤波
为了克服局部平均法造成图像模糊的弊端,又提出了一些保持边缘细节的局部平滑算法,图像高斯滤波(高斯平滑)就是这样一种算法。它是应用邻域平均思想对图像进行平滑的一种线性平滑滤波,对于抑制服从正态分布的噪声非常有效,适用于消除高斯噪声,被广泛应用于图像处理的减噪过程。
图像高斯滤波为图像不同位置的像素值赋予了不同的权重,距离越近的点权重越大,距离越远的点权重越小。它与方框滤波和均值滤波不同,它对邻域内的像素进行平均时,为不同位置的像素赋予不同的权值。通俗地讲,高斯滤波就是对整幅图像进行加权平均的过程,每一个像素点的值,都由其本身和邻域内的其他像素值(权重不同)经过加权平均后得到。
下面是常用的3×3和5×5内核的高斯滤波模板。
高斯滤波引入了数学中的高斯函数(正态分布函数),一个二维高斯函数如下公式(9)所示,其中σ为标准差。高斯加权平均中,最重要是σ的选取,标准差代表数据离散程度,如果σ较小,则高斯分布中心区域将更加聚集,平滑效果更差;反之,如果σ较大,高斯分布中心区域将更离散,平滑效果更明显[10]。
高斯滤波的核心思想是对高斯函数进行离散化,以离散点上的高斯函数值为权值,对图像中的每个像素点做一定范围邻域内的加权平均,从而有效地消除高斯噪声。高斯滤波让临近中心的像素点具有更高的重要度,对周围像素计算加权平均值,如图10所示,其中心位置权重最高为0.4。
Python中OpenCV主要调用GaussianBlur()函数实现高斯平滑处理,函数原型如下所示:
dst = GaussianBlur(src, ksize, sigmaX[, dst[, sigmaY[, borderType]]])
- src表示待处理的输入图像
- dst表示输出图像,其大小和类型与输入图像相同
- ksize表示高斯滤波器模板大小,ksize.width和ksize.height可以不同,但它们都必须是正数和奇数,它们也可以是零,即(0, 0)
- sigmaX表示高斯核函数在X方向的高斯内核标准差
- sigmaY表示高斯核函数在Y方向的高斯内核标准差。如果sigmaY为零,则设置为等于sigmaX,如果两个sigma均为零,则分别从ksize.width和ksize.height计算得到
- borderType表示边框模式,用于推断图像外部像素的某种边界模式,默认值为BORDER_DEFAULT,可省略
下面代码是使用7×7核模板进行高斯滤波处理。
# -*- 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.GaussianBlur(source, (7,7), 0)
#用来正常显示中文标签
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()
输出结果如图11所示,左边为待处理图像,右边为高斯滤波处理后图像。
图12是使用15×15高斯核模板进行高斯滤波处理的效果图,由图可知,图像在去除噪声的同时也变得更加模糊。
总之,高斯滤波作为最有效的滤波器之一,它对于抑制服从正态分布的噪声非常有效。
五.总结
本文主要讲解了常用于消除噪声的图像平滑方法,常见方法包括三种线性滤波(均值滤波、方框滤波、高斯滤波)和两种非线性滤波(中值滤波、双边滤波)。这篇文章介绍了均值滤波、方框滤波和高斯滤波,通过原理和代码进行对比,分别讲述了各种滤波方法的优缺点,有效地消除了图像的噪声,并保留图像的边缘轮廓。
感谢在求学路上的同行者,不负遇见,勿忘初心。图像处理系列主要包括三部分,分别是:
2022年即将离去,又是忙碌的一年,感谢女神的鼓励和小珞治愈的笑容。十月份会更加忙碌,希望一切顺利。守得云开见明月,加油!读博四年,还是写了一些东西,从初入安全的无知到现在的懵懂,也记录一些笔记,也希望对大家有所帮助。今年确实没啥时间写博客了,也没太多时间详细解答博友的问题,还请见谅。图片中颜色越浅甚至白色的时候,自己往往越忙,更多的博客和代码是寒暑假分享,项目、学习、科研、技术,最重要的还是家庭和亲情,娜美人生,感恩前行。爱你们喔,晚安娜。傲娇的表情,小珞的玩具,哈哈~
(By:Eastmount 2022-10-24 夜于武汉 http://blog.csdn.net/eastmount/ )
参考文献:
- [1]冈萨雷斯著,阮秋琦译. 数字图像处理(第3版)[M]. 北京:电子工业出版社,2013.
- [2]zhu_hongji. [OpenCV学习笔记] 之图像平滑(线性/非线性滤波器)[EB/OL]. (2018-08-11). https://blog.csdn.net/zhu_hongji/article/details/81479571.
- [3]陆瑶. 图像处理与matlab实例之图像平滑(一)[EB/OL]. (2017-07-23). https://www.cnblogs.com/luyaoblog/p/7160948.html.
- [4]阮秋琦. 数字图像处理学(第3版)[M]. 北京:电子工业出版社,2008.
- [5]石振刚. 基于模糊逻辑的图像处理算法研究[D]. 东北大学, 2009.
- [6]马光豪. 基于稀疏高频梯度和联合双边滤波的图像平滑算法研究[D].山东大学, 2018.
- [7]陈初侠. 图像滤波及边缘检测与增强技术研究[D].合肥工业大学, 2009.
- [8]毛星云,冷雪飞. OpenCV3编程入门[M]. 北京:电子工业出版社,2015.
- [9]Eastmount. [Python图像处理] 四.图像平滑之均值滤波、方框滤波、高斯滤波及中值滤波[EB/OL]. (2018-09-02). https://blog.csdn.net/Eastmount/article/details/82216380.
- [10]Eastmount. [数字图像处理] 七.MFC图像增强之图像普通平滑、高斯平滑、Laplacian、Sobel、Prewitt锐化详解[EB/OL]. (2015-06-08). https://blog.csdn.net/eastmount/article/ details/46378783.
转载:https://blog.csdn.net/Eastmount/article/details/127485114