本文分享自华为云社区《[Python图像处理] 四.图像平滑之均值滤波、方框滤波、高斯滤波及中值滤波 | 【成长吧!
Python】-云社区-华为云》,作者:eastmount 。
本篇文章紧张讲解Python调用OpenCV实现图像平滑,包括四个算法:均值滤波、方框滤波、高斯滤波和中值滤波。全文均是根本知识,希望对您有所帮助。
图像增强是对图像进行处理,使其比原始图像更适宜于特定的运用,它须要与实际运用相结合。对付图像的某些特色如边缘、轮廓、比拟度等,图像增强是进行强调或锐化,以便于显示、不雅观察或进一步剖析与处理。图像增强的方法是因运用不同而不同的,研究内容包括:(参考课件和左飞的《数字图像处理》)

2.图像平滑
图像平滑是一种区域增强的算法,平滑算法有邻域均匀法、中指滤波、边界保持类滤波等。在图像产生、传输和复制过程中,常常会由于多方面缘故原由而被噪声滋扰或涌现数据丢失,降落了图像的质量(某一像素,如果它与周围像素点比较有明显的不同,则该点被噪声所传染)。这就须要对图像进行一定的增强处理以减小这些毛病带来的影响。
大略平滑-邻域均匀法
3.邻域均匀法图像大略平滑是指通过邻域大略均匀对图像进行平滑处理的方法,用这种方法在一定程度上肃清原始图像中的噪声、降落原始图像比拟度的浸染。它利用卷积运算对图像邻域的像素灰度进行均匀,从而达到减小图像中噪声影响、降落图像比拟度的目的。
但邻域均匀值紧张缺陷是在降落噪声的同时使图像变得模糊,特殊在边缘和细节处,而且邻域越大,在去噪能力增强的同时模糊程度越严重。
首先给出为图像增加噪声的代码。
# -- coding:utf-8 --import cv2import numpy as np#读取图片img = cv2.imread("test.jpg", cv2.IMREAD_UNCHANGED)rows, cols, chn = img.shape#加噪声for i in range(5000): x = np.random.randint(0, rows) y = np.random.randint(0, cols) img[x,y,:] = 255cv2.imshow("noise", img) #等待显示cv2.waitKey(0)cv2.destroyAllWindows()
输出结果如下所示:
二.均值滤波1.事理
均值滤波是指任意一点的像素值,都是周围NM个像素值的均值。例如下图中,赤色点的像素值为蓝色背景区域像素值之和除25。
个中赤色区域的像素值均值滤波处理过程为: ((197+25+106+156+159)+ (149+40+107+5+71)+ (163+198+226+223+156)+ (222+37+68+193+157)+ (42+72+250+41+75)) / 25
个中55的矩阵称为核,针对原始图像内的像素点,采取核进行处理,得到结果图像。
提取1/25可以将核转换为如下形式:
2.代码
Python调用OpenCV实现均值滤波的核心函数如下:
result = cv2.blur(原始图像,核大小)
个中,核大小因此(宽度,高度)表示的元祖形式。常见的形式包括:核大小(3,3)和(5,5)。
代码如下所示:
#encoding:utf-8import cv2 import numpy as np import matplotlib.pyplot as plt#读取图片img = cv2.imread('test01.png')source = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)#均值滤波result = cv2.blur(source, (5,5))#显示图形titles = ['Source Image', 'Blur Image'] images = [source, result] for i in xrange(2): plt.subplot(1,2,i+1), plt.imshow(images[i], 'gray') plt.title(titles[i]) plt.xticks([]),plt.yticks([]) plt.show()
输出结果如下图所示:
核设置为(10,10)和(20,20)会让图像变得更加模糊。
如果设置为(1,1)处理结果便是原图,核中每个权重值相同,称为均值。
三.方框滤波方框滤波和均值滤波核基本同等,差异是需不须要均一化处理。OpenCV调用boxFilter()函数实现方框滤波。函数如下:
result = cv2.boxFilter(原始图像, 目标图像深度, 核大小, normalize属性)
个中,目标图像深度是int类型,常日用“-1”表示与原始图像同等;核大小紧张包括(3,3)和(5,5),如下所示。
normalize属性表示是否对目标图像进行归一化处理。当normalize为true时须要实行均值化处理,当normalize为false时,不进行均值化处理,实际上为求周围各像素的和,很随意马虎发生溢出,溢出时均为白色,对应像素值为255。
在图像大略平滑中,算法利用卷积模板逐一处理图像中每个像素,这一过程可以形象地比为难刁难原始图像的像素逐一进行过滤整理,在图像处理中把邻域像素逐一处理的算法过程称为滤波器。平滑线性滤波器的事情事理是利用模板对邻域内像素灰度进行加权均匀,也称为均值滤波器。
代码如下所示:
#encoding:utf-8import cv2 import numpy as np import matplotlib.pyplot as plt#读取图片img = cv2.imread('test01.png')source = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)#方框滤波result = cv2.boxFilter(source, -1, (5,5), normalize=1)#显示图形titles = ['Source Image', 'BoxFilter Image'] images = [source, result] for i in xrange(2): plt.subplot(1,2,i+1), plt.imshow(images[i], 'gray') plt.title(titles[i]) plt.xticks([]),plt.yticks([]) plt.show()
代码中利用55的核,normalize=1表示进行归一化处理,此时与均值滤波相同,输出结果如下图所示:
下面是图像左上角处理前后的像素结果:
print(source[0:3, 0:3, 0])#[[115 180 106]# [ 83 152 72]# [ 55 58 55]]print(result[0:3, 0:3, 0])#[[92 90 78]# [92 89 77]# [82 80 72]]
如果省略参数normalize,则默认是进行归一化处理。如果normalize=0则不进行归一化处理,像素值为周围像素之和,图像更多为白色。
#encoding:utf-8import cv2 import numpy as np import matplotlib.pyplot as plt#读取图片img = cv2.imread('test01.png')source = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)#方框滤波result = cv2.boxFilter(source, -1, (5,5), normalize=0)#显示图形titles = ['Source Image', 'BoxFilter Image'] images = [source, result] for i in xrange(2): plt.subplot(1,2,i+1), plt.imshow(images[i], 'gray') plt.title(titles[i]) plt.xticks([]),plt.yticks([]) plt.show()
输出结果如下图所示:
上图很多像素为白色,由于图像求和结果险些都是255。如果设置的是22矩阵,只取四个像素结果要好些。result = cv2.boxFilter(source, -1, (2,2), normalize=0)
四.高斯滤波
为了战胜大略局部均匀法的弊端(图像模糊),目前已提出许多保持边缘、细节的局部平滑算法。它们的出发点都集中在如何选择邻域的大小、形状和方向、参数加均匀及邻域各店的权重系数等。
图像高斯平滑也是邻域均匀的思想对图像进行平滑的一种方法,在图像高斯平滑中,对图像进行均匀时,不同位置的像素被授予了不同的权重。高斯平滑与大略平滑不同,它在对邻域内像素进行均匀时,给予不同位置的像素不同的权值,下图的所示的 3 3 和 5 5 领域的高斯模板。
高斯滤波让附近的像素具有更高的主要度,对周围像素打算加权均匀值,较近的像素具有较大的权重值。如下图所示,中央位置权重最高为0.4。
Python中OpenCV紧张调用GaussianBlur函数,如下:
dst = cv2.GaussianBlur(src, ksize, sigmaX)
个中,src表示原始图像,ksize表示核大小,sigmaX表示X方向方差。把稳,核大小(N, N)必须是奇数,X方向方差紧张掌握权重。
代码如下:
#encoding:utf-8import cv2 import numpy as np import matplotlib.pyplot as plt#读取图片img = cv2.imread('test01.png')source = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)#高斯滤波result = cv2.GaussianBlur(source, (3,3), 0)#显示图形titles = ['Source Image', 'GaussianBlur Image'] images = [source, result] for i in xrange(2): plt.subplot(1,2,i+1), plt.imshow(images[i], 'gray') plt.title(titles[i]) plt.xticks([]),plt.yticks([]) plt.show()
输出结果如下所示:
如果利用1515的核,则图形将更加模糊。
五.中值滤波1.观点
在利用邻域均匀法去噪的同时也使得边界变得模糊。而中值滤波是非线性的图像处理方法,在去噪的同时可以兼顾到边界信息的保留。选一个含有奇数点的窗口W,将这个窗口在图像上扫描,把窗口中所含的像素点按灰度级的升或降序排列,取位于中间的灰度值来代替该点的灰度值。 例如选择滤波的窗口如下图,是一个一维的窗口,待处理像素的灰度取这个模板中灰度的中值,滤波过程如下:
如下图所示,将附近像素按照大小排列,取排序像素中位于中间位置的值作为中值滤波的像素值。
2.代码OpenCV紧张调用medianBlur()函数实现中值滤波。图像平滑里中值滤波的效果最好。
dst = cv2.medianBlur(src, ksize)
个中,src表示源文件,ksize表示核大小。核必须是大于1的奇数,如3、5、7等。
代码如下所示:
#encoding:utf-8import cv2 import numpy as np import matplotlib.pyplot as plt#读取图片img = cv2.imread('test01.png')#高斯滤波result = cv2.medianBlur(img, 3)#显示图像cv2.imshow("source img", img)cv2.imshow("medianBlur", result)#等待显示cv2.waitKey(0)cv2.destroyAllWindows()
输出结果如下图所示:
常用的窗口还有方形、十字形、圆形和环形。不同形状的窗口产生不同的滤波效果,方形和圆形窗口适宜外轮廓线较长的物体图像,而十字形窗口对有尖顶角状的图像效果好。中值滤波对付肃清伶仃点和线段的滋扰十分有用,尤其是对付二进噪声,但对肃清高斯噪声的影响效果不佳。对付一些细节较多的繁芜图像,可以多次利用不同的中值滤波。
希望文章对大家有所帮助,如果有缺点或不敷之处,还请海涵。
本文摘录自eastmount X华为云开拓者社区联合出品的电子书《从零到一 • Python图像处理及识别》。
后台回答关键词【python】,获取电子书《从零到一 • Python图像处理及识别》
点击下方,第一韶光理解华为云新鲜技能~
华为云博客_大数据博客_AI博客_云打算博客_开拓者中央-华为云