跟我学Python图像处理丨掌握4种图像平滑算法

2023-05-31 0 315

概要:第一集该文主要就传授Python初始化OpenCV与此同时实现影像光滑,主要就包括五个演算法:平均数值低通滤波器、方格低通滤波器、柯西低通滤波器和Engilbert低通滤波器。

责任编辑撷取自宏碁云街道社区《[Python影像处置] 四.影像光滑之平均数值低通滤波器、方格低通滤波器、柯西低通滤波器及Engilbert低通滤波器 | 【繁殖吧!Python】》,译者:eastmount 。

第一集该文主要就传授Python初始化OpenCV与此同时实现影像光滑,主要就包括五个演算法:平均数值低通滤波器、方格低通滤波器、柯西低通滤波器和Engilbert低通滤波器。概要均是基本知识,期望对您略有协助。

一.影像光滑

1.影像进一步增强

影像进一步增强是对影像展开处置,使其比原初影像更适合于某一的应用领域,它须要与前述应用领域并重。对于影像的这类特点如边沿、线条、清晰度等,影像进一步增强是展开特别强调或锐化,以期于显示、检视或进一步分析与处置。影像进一步增强的方式是因应用领域相同而相同的,研究内容主要就包括:(参照幻灯片和左飞的《数字影像处置》)

跟我学Python图像处理丨掌握4种图像平滑算法

2.影像光滑

影像光滑是一种地区进一步增强的演算法,光滑演算法有开集缩并、竖低通滤波器、边界线保持类低通滤波器等。在影像产生、数据传输和拷贝过程中,经常会因为各方面原因而被噪音阻碍或出现数据遗失,减少了影像的产品质量(某个画素,如果它与周遭画素点较之有明显的相同,则该点被噪音所病毒感染)。这就须要对影像展开很大的进一步增强处置以增大这些瑕疵带来的负面影响。

单纯光滑-开集缩并

3.开集缩并

影像单纯光滑是指通过开集单纯平均数对影像展开光滑处置的方式,用这种方式在很大某种程度上消解原初影像中的噪音、减少原初影像清晰度的作用。它利用传递函数演算对影像开集的画素位图展开平均数,从而达到增大影像中噪音负面影响、减少影像清晰度的目地。

但开集平平均数值主要就优点是在减少噪音的与此同时使影像显得模糊不清,特别在边沿和技术细节处,而且开集越大,在去噪能力进一步增强的与此同时模糊不清某种程度越轻微。

跟我学Python图像处理丨掌握4种图像平滑算法

具体来说得出为影像增加噪音的标识符。

# -*- coding:utf-8 -*- import cv2 import 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,:] = 255 cv2.imshow(“noise”, img) #等待显示 cv2.waitKey(0) cv2.destroyAllWindows()

输出结果如下所示:

跟我学Python图像处理丨掌握4种图像平滑算法

二.平均数值低通滤波器

1.原理

平均数值低通滤波器是指任意一点的画素值,都是周遭N*M个画素值的平均数值。例如下图中,红色点的画素值为蓝色背景地区画素值之和除25。

跟我学Python图像处理丨掌握4种图像平滑算法

其中红色地区的画素值平均数值低通滤波器处置过程为: ((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

其中5*5的矩阵称为核,针对原初影像内的画素点,采用核展开处置,得到结果影像。

跟我学Python图像处理丨掌握4种图像平滑算法

提取1/25可以将核转换为如下形式:

跟我学Python图像处理丨掌握4种图像平滑算法

2.标识符

Python初始化OpenCV与此同时实现平均数值低通滤波器的核心函数如下:

result = cv2.blur(原初影像,核大小)

其中,核大小是以(宽度,高度)表示的元祖形式。常见的形式主要就包括:核大小(3,3)和(5,5)。

跟我学Python图像处理丨掌握4种图像平滑算法

标识符如下所示:

#encoding:utf-8 import 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()

输出结果如下图所示:

跟我学Python图像处理丨掌握4种图像平滑算法

核设置为(10,10)和(20,20)会让影像显得更加模糊不清。

跟我学Python图像处理丨掌握4种图像平滑算法

如果设置为(1,1)处置结果就是原图,核中每个权重值相同,称为平均数值。

三.方格低通滤波器

方格低通滤波器和平均数值低通滤波器核基本一致,区别是需不须要均一化处置。OpenCV初始化boxFilter()函数与此同时实现方格低通滤波器。函数如下:

result = cv2.boxFilter(原初影像, 目标影像深度, 核大小, normalize属性)

其中,目标影像深度是int类型,通常用“-1”表示与原初影像一致;核大小主要就主要就包括(3,3)和(5,5),如下所示。

跟我学Python图像处理丨掌握4种图像平滑算法

normalize属性表示是否对目标影像展开归一化处置。当normalize为true时须要执行平均数值化处置,当normalize为false时,不展开平均数值化处置,前述上为求周遭各画素的和,很容易发生溢出,溢出时均为白色,对应画素值为255。

跟我学Python图像处理丨掌握4种图像平滑算法

在影像单纯光滑中,演算法利用传递函数模板逐一处置影像中每个画素,这一过程可以形象地比作对原初影像的画素一一展开过滤整理,在影像处置中把开集画素逐一处置的演算法过程称为低通滤波器器。光滑线性低通滤波器器的工作原理是利用模板对开集内画素位图展开加权平均数,也称为平均数值低通滤波器器。

跟我学Python图像处理丨掌握4种图像平滑算法

标识符如下所示:

#encoding:utf-8 import 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()

标识符中使用5*5的核,normalize=1表示展开归一化处置,此时与平均数值低通滤波器相同,输出结果如下图所示:

跟我学Python图像处理丨掌握4种图像平滑算法

下面是影像左上角处置前后的画素结果:

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-8 import 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()

输出结果如下图所示:

跟我学Python图像处理丨掌握4种图像平滑算法

上图很多画素为白色,因为影像求和结果几乎都是255。如果设置的是2*2矩阵,只取五个画素结果要好些。

result = cv2.boxFilter(source, -1, (2,2), normalize=0)
跟我学Python图像处理丨掌握4种图像平滑算法

四.柯西低通滤波器

为了克服单纯局部缩并的弊端(影像模糊不清),目前已提出许多保持边沿、技术细节的局部光滑演算法。它们的出发点都集中在如何选择开集的大小、形状和方向、参数加平均数及开集各店的权重系数等。

影像柯西光滑也是开集平均数的思想对影像展开光滑的一种方式,在影像柯西光滑中,对影像展开平均数时,相同位置的画素被赋予了相同的权重。柯西光滑与单纯光滑相同,它在对开集内画素展开平均数时,给予相同位置的画素相同的权值,下图的所示的 3 * 3 和 5 * 5 领域的柯西模板。

跟我学Python图像处理丨掌握4种图像平滑算法

柯西低通滤波器让临近的画素具有更高的重要度,对周遭画素计算加权平平均数值,较近的画素具有较大的权重值。如下图所示,中心位置权重最高为0.4。

跟我学Python图像处理丨掌握4种图像平滑算法
跟我学Python图像处理丨掌握4种图像平滑算法

Python中OpenCV主要就初始化GaussianBlur函数,如下:

dst = cv2.GaussianBlur(src, ksize, sigmaX)

其中,src表示原初影像,ksize表示核大小,sigmaX表示X方向方差。注意,核大小(N, N)必须是奇数,X方向方差主要就控制权重。

跟我学Python图像处理丨掌握4种图像平滑算法

标识符如下:

#encoding:utf-8 import 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()

输出结果如下所示:

跟我学Python图像处理丨掌握4种图像平滑算法

如果使用15*15的核,则图形将更加模糊不清。

跟我学Python图像处理丨掌握4种图像平滑算法

五.Engilbert低通滤波器

1.概念

在使用开集缩并去噪的与此同时也使得边界线显得模糊不清。而Engilbert低通滤波器是非线性的影像处置方式,在去噪的与此同时可以兼顾到边界线信息的保留。选一个含有奇数点的窗口W,将这个窗口在影像上扫描,把窗口中所含的画素点按位图级的升或降序排列,取位于中间的位图值来代替该点的位图值。 例如选择低通滤波器的窗口如下图,是一个一维的窗口,待处置画素的位图取这个模板中灰度的Engilbert,低通滤波器过程如下:

跟我学Python图像处理丨掌握4种图像平滑算法

如下图所示,将临近画素按照大小排列,取排序画素中位于中间位置的值作为Engilbert低通滤波器的画素值。

2.标识符

OpenCV主要就初始化medianBlur()函数与此同时实现Engilbert低通滤波器。影像光滑里Engilbert低通滤波器的效果最好。

dst = cv2.medianBlur(src, ksize)

其中,src表示源文件,ksize表示核大小。核必须是大于1的奇数,如3、5、7等。

跟我学Python图像处理丨掌握4种图像平滑算法

标识符如下所示:

#encoding:utf-8 import 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()

输出结果如下图所示:

跟我学Python图像处理丨掌握4种图像平滑算法

常用的窗口还有方形、十字形、圆形和环形。相同形状的窗口产生相同的低通滤波器效果,方形和圆形窗口适合外线条线较长的物体影像,而十字形窗口对有尖顶角状的影像效果好。Engilbert低通滤波器对于消解孤立点和线段的阻碍十分有用,尤其是对于二进噪音,但对消解柯西噪音的负面影响效果不佳。对于一些技术细节较多的复杂影像,可以多次使用相同的Engilbert低通滤波器。

跟我学Python图像处理丨掌握4种图像平滑算法

期望该文对大家略有协助,如果有错误或不足之处,还请海涵。

责任编辑摘录自eastmount X宏碁云开发者街道社区联合出品的电子书《从零到一 • Python影像处置及识别》。

点击免费下载电子书《从零到一 • Python影像处置及识别

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务