艺考网
全国站

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

xunaa
2024-10-08 07:17:54
编辑说
本文主要讲解Python如何调用OpenCV实现图像平滑,包括均值滤波、盒式滤波、高斯滤波和中值滤波四种算法。整篇文章都是基础知识,希望对您有所帮助。
一.图像平滑
1.图像增强

本文主要讲解Python如何调用OpenCV实现图像平滑,包括均值滤波、盒式滤波、高斯滤波和中值滤波四种算法。整篇文章都是基础知识,希望对您有所帮助。

一.图像平滑

1.图像增强

图像增强是对图像进行处理,使其比原始图像更适合特定应用。需要与实际应用相结合。图像增强是强调或锐化图像的某些特征,如边缘、轮廓、对比度等,以利于显示、观察或进一步分析处理。图像增强方法因应用而异。研究内容包括:(参考课件及左飞的《数字图像处理》)

2.图像平滑

简单平滑邻域平均法

3.邻域平均法

图像简单平滑是指通过简单邻域平均来平滑图像的方法。该方法可以消除原始图像中的噪声,并在一定程度上降低原始图像的对比度。它利用卷积运算对图像邻域内的像素灰度进行平均,从而达到减少图像中噪声的影响、降低图像对比度的目的。

然而,邻域平均的主要缺点是它在减少噪声的同时使图像变得模糊,特别是在边缘和细节处。而且邻域越大,在增强去噪能力的同时,模糊程度也越严重。

首先给出给图像添加噪声的代码。

# -*-coding:utf-8 -*-import cv2import numpy as np#读取图像img=cv2.imread('test.jpg', cv2.IMREAD_UNCHANGED)rows, cols, chn=img.shape#为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.原理

均值滤波是指任意点的像素值是周围N*M个像素值的平均值。例如下图中,红色点的像素值就是蓝色背景区域的像素值之和除以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

5*5的矩阵称为核。使用核对原始图像中的像素进行处理以获得结果图像。

提取1/25将内核转换成以下形式:

2.代码

Python调用OpenCV实现均值滤波的核心功能如下:

结果=cv2.blur(原始图像,内核大小)

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

其中内核大小的原始形式表示为(宽度,高度)。常见形式包括:磁芯尺寸(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)#均值滤波结果=cv2. Blur(source, (5,5))#显示图形标题=['源图像', '模糊图像'] images=[源, 结果] 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(原始图像、目标图像深度、内核大小、归一化属性)

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

Normalize属性表示是否对目标图像进行归一化。当normalize为true时,需要进行平均处理。当归一化为假时,不进行平均处理。事实上,为了求周围像素的和,很容易出现溢出。溢出时全是白色,对应的像素值为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)#Box filter result=cv2 .boxFilter (source, -1, (5,5), normalize=1)#显示图形标题=['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表示标准化处理。这与均值过滤相同。输出结果如下图所示:

下面是图像左上角处理前后的像素结果:

打印(源[0:3, 0:3, 0])#[[115 180 106]# [ 83 152 72]# [ 55 58 55]]打印(结果[0:3, 0:3, 0])#[[92 90 78]# [92 89 77]# [82 80 72]]如果省略归一化参数,则默认进行归一化。如果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)#Box filter result=cv2 .boxFilter (source, -1, (5,5), normalize=0)#显示图形标题=['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。如果设置2*2 矩阵,如果只取四个像素,结果会更好。结果=cv2.boxFilter(源, -1, (2,2), 归一化=0)

四.高斯滤波

为了克服简单的局部平均方法(图像模糊)的缺点,人们提出了许多保持边缘和细节的局部平滑算法。他们的出发点集中在如何选择邻域的大小、形状和方向、参数平均以及邻域内每个商店的权重系数。

图像高斯平滑也是一种基于邻域平均思想的对图像进行平滑的方法。在图像高斯平滑中,对图像进行平均时,不同位置的像素被赋予不同的权重。高斯平滑不同于简单平滑。对邻域内的像素进行平均时,它对不同位置的像素赋予不同的权重。下图显示了3 * 3和5 * 5字段中的高斯模板。

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

高斯滤波赋予附近像素更高的重要性,并计算周围像素的加权平均值。越近的像素具有越大的权重值。如下图所示,中心位置权重高达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)#显示图形标题=['源图像', 'GaussianBlur图像'] 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() 输出结果如下图:

如果使用15*15的内核,图形会更加模糊。

五.中值滤波

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()的输出如下图:

常用的窗户形状有方形、十字形、圆形和环形。不同形状的窗口产生不同的过滤效果。方形和圆形窗口适用于具有长外轮廓的物体的图像,而十字形窗口则适用于具有尖角的图像。中值滤波对于消除孤立点和线段的干扰非常有用,特别是对于二值噪声,但对于消除高斯噪声的影响效果不佳。对于一些细节较多的复杂图像,可以多次使用不同的中值滤波器。

希望这篇文章对大家有所帮助。如果有任何错误或不足之处,请告诉我。

用户评论

发型不乱一切好办

终于找到能教会我Python图像处理的课程了!

    有5位网友表示赞同!

灬一抹丶苍白

之前一直想学习图像平滑,这4种算法一定要认真研究一下。

    有20位网友表示赞同!

╯念抹浅笑

期待了解更多关于Python图像处理知识!

    有17位网友表示赞同!

何年何念

imparare Python per il trattamento delle immagini!

    有19位网友表示赞同!

迁心

平滑算法对处理噪声很有效,希望能掌握这些技巧。

    有15位网友表示赞同!

荒野情趣

我需要提升python图像处理的能力,这篇文章刚好来凑!

    有10位网友表示赞同!

你身上有刺,别扎我

厉害!Python图像处理太神奇了!

    有12位网友表示赞同!

红尘滚滚

要学好图像处理肯定得从基础的平滑算法开始!

    有17位网友表示赞同!

清羽墨安

看点十足!一定要学习这些算法提高我的图像处理水平!

    有11位网友表示赞同!

此刻不是了i

python图像处理入门,从这篇文章开始吧!

    有17位网友表示赞同!

煮酒

感觉这4种图像平滑算法很基础,希望能深入了解他们的原理和应用场景! <br>

    有15位网友表示赞同!

毒舌妖后

最近在研究图像处理,来学习下Python的技巧!

    有8位网友表示赞同!

空谷幽兰

很棒!我很想掌握图像平滑算法。

    有7位网友表示赞同!

(り。薆情海

期待实战练习! Python 图像处理好强大。

    有12位网友表示赞同!

疯人疯语疯人愿

这篇文章很有用!

    有16位网友表示赞同!

铁树不曾开花

感谢分享这些知识!

    有15位网友表示赞同!

信仰

Python是图像处理的热门语言,学习必备!

    有12位网友表示赞同!

有一种中毒叫上瘾成咆哮i

一定要学一学! python图像处理课程太棒了

    有9位网友表示赞同!

免责声明
本站所有收录的学校、专业及发布的图片、内容,均收集整理自互联网,仅用于信息展示,不作为择校或选择专业的建议,若有侵权请联系删除!

大家都在看

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

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

本文主要讲解Python如何调用OpenCV实现图像平滑,包括均值滤波、盒式滤波、高斯滤波和中值滤波四种算法。整篇文章都是基础知识,希望对您有所帮助。 一.图像平滑 1.图像增强 图
2024-10-08
使用subplot_mosaic 创建复杂的子图布局

使用subplot_mosaic 创建复杂的子图布局

首先使用Import matplotlib 行导入必要的库。 import matplotlib.pyplot as pltimport numpy as np 然后我们使用Numpy 生成随机数。 # 生成随机数据data_size=10
2024-10-08
如何利用Hough变换算法实现直线检测

如何利用Hough变换算法实现直线检测

I. 动机 II. 霍夫变换 霍夫变换是Paul V.C. 的专利算法。 Hough 于1962 年发明,最初是为了识别照片中的复杂线条而发明的。自该算法发明以来,它一直在不断修改和增强,现在能
2024-10-08
你还不懂的傅里叶变换,神经网络只用了30多行代码就学会了

你还不懂的傅里叶变换,神经网络只用了30多行代码就学会了

通俗地说,离散傅里叶变换(DFT)就是将一系列复杂的波形划分为不同的频率分量。 比如说声音,如果用录音机来显示声音的话,其实生活中大部分的声音都是非常复杂甚至是杂乱的。 通过
2024-10-08
过去分词作为表语和状语的总结

过去分词作为表语和状语的总结

1.过去分词作为表语成分 过去分词作为表语成分并不意味着“完整”或“被动”。主要表达主体的感情或心理状态,主体通常是人。 示例:地中海四分之一的海岸受到污染。 他似乎很
2024-10-08
动词不定式、动名词、分词等非谓语形式的几种类型、含义和作用

动词不定式、动名词、分词等非谓语形式的几种类型、含义和作用

动词不定式、动名词、分词三种形式都是动词的非谓语形式;分词包括两种形式:现在分词和过去分词。它们不能单独作为句子中的谓词。 动词不定式 形式:动词不定式的基本形式由“不
2024-10-08
考研阅读提高成绩的几点

考研阅读提高成绩的几点

一、英语阅读理解的命题特点 (一)阅读理解的命题特征 一、阅读理解的定义及其答题启示 阅读理解的定义有很多种,但总的来说我们认为阅读理解本质上是认知能力、逻辑思维能力
2024-10-08
高中英语第二单元(必修四)关键短语讲解,值得评分!

高中英语第二单元(必修四)关键短语讲解,值得评分!

1. 与斗争相同。斗争 他正在与坏人作斗争 2. 奋斗。和奋斗 他正在为自己的权利而奋斗 3. 挣扎着站起来 他挣扎着站起来 4.感谢 谢谢你,我可以通过考试谢谢你,我可以通过考试 5
2024-10-08
#squirrelsplitword #struggle

#squirrelsplitword #struggle

拆除: str- 意思是“抓住,紧紧抓住”。我个人的理解是用手做某事,可以恰当地理解为“撕开” 丑陋,丑陋 猜: 双手被撕破是什么丑陋的现象? 答复: 斗争、反抗、斗争 用户评论 寒
2024-10-08
今天分享两个单词并利用词根词缀来记忆(37)

今天分享两个单词并利用词根词缀来记忆(37)

名词派遣、发送、紧急邮件、电信 v. 派遣,派出,发送 根: -patch:同ped-、pod-、=foot,表示脚。 词缀: dis-:意为“分开、分散”,引申为“离开、无、无、缺少、相反”等。 dis-+-patc
2024-10-08