Python实现图像中值滤波降噪详解
本文详细介绍利用Python进行图像降噪的方法,重点讲解中值滤波算法原理。通过遍历像素并计算3x3邻域灰度值的中位数,有效去除图像中的椒盐噪声。文章包含完整的代码实现步骤及测试验证说明,帮助开发者掌握基础图像处理技巧。
本文提供了使用Python实现图像降噪的具体代码示例,供读者参考学习。
任务描述
背景
在图像的数字化采集和传输过程中,往往会产生噪声,进而降低图像质量。图像降噪技术旨在有效减少这些噪声干扰。如图所示,左侧为包含噪声的原始图像(图中黑点代表噪声),右侧为经过降噪处理后的结果,可见黑点显著减少,图像清晰度得到提升。

中值滤波是常见的图像降噪手段之一。针对一幅带有噪声的图像1(假设其分辨率为w×h),降噪处理流程如下:
1)将图像1转换为灰度图像,仍记为图像1; 2)创建新图像2,该图像为灰度图,且分辨率与图像1保持一致; 3)对于图像1中坐标为(x,y)的像素p,计算其周围像素的中值c,并将图像2中对应坐标(x,y)处的像素值设为c,其中x的取值范围为1≤x≤w−2,y的取值范围为1≤y≤h−2; 4)保存图像2,该图像即为降噪后的最终结果。
在上述第3步中,计算坐标(x,y)处像素p的中值c的具体方法如下:

1)选取以像素p为中心的3×3图像区域,如上图所示,每个小方格代表一个像素,数字表示该像素的灰度值。若像素p的坐标为(x,y),则选取的区域为图中黄色底纹覆盖的部分; 2)对步骤1中选出的9个像素的灰度值进行升序排列。例如,排序后的结果可能为:11、12、13、14、15、16、17、18、99; 3)在步骤2得到的排序序列中,位于正中间的那个值即为中值c。如上例所示,像素p的中值为15。
任务
本关任务要求补全程序代码,以实现图像降噪功能。具体说明如下: 1)排序操作可以使用Python列表提供的sort函数完成; 2)关于代码的具体细节和逻辑,请参考代码中的注释说明。
相关知识
略。
编程要求
请在Begin-End代码区间内补全代码,具体要求见上文描述。
测试说明
测试集的正确输出结果如下:
( 1 , 1 ) -> 255 (72 , 42) -> 191 (120, 45) -> 127 (164, 49) -> 89 (235, 49) -> 38
你的图像与正确答案相同!
说明如下:
1)系统会调用你编写的median函数,并以“像素坐标 -> 中值”的格式打印计算结果。例如,测试集第1行的(1 , 1 ) -> 255表示:坐标(1,1)处像素的中值为255; 2)此外,系统会检查程序生成的图像文件。若图像生成正确,则在测试集最后一行打印“你的图像与正确答案相同!”以确认结果。
开始你的任务吧,祝你成功!
from PIL import Image
# 求图像img中(x,y)处像素的中值c
def median(img, x, y):
########## Begin ##########
L = []
xl = [x-1,x,x+1]
yl = [y-1,y,y+1]
for i in xl:
for j in yl:
gray = img.getpixel((i, j)) # 取出灰度值
L.append(gray)
L.sort()
c = L[4]
########## End ##########
return c
# 对图像文件1进行降噪,并将结果保存为图像文件2
# 图像文件1和2的路径分别为path1和path2
def denoise(path1, path2):
img1 = Image.open(path1) # 图像1
img1 = img1.convert('L') # 将图像1转换为灰度图
w, h = img1.size
img2 = Image.new('L', (w, h), 'white') # 图像2
for x in range(1, w - 1):
for y in range(1, h - 1):
c = median(img1, x, y) # 求中值
img2.putpixel((x, y), c) # 将灰度设置为中值
img2.save(path2)
path1 = 'step4.bmp' # 带噪声的图像
path2 = 'step4_2.bmp' # 降噪后的图像
denoise(path1, path2)
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













