任务描述
背景
图像在数字化和传输等过程中会产生噪声,从而影响图像的质量,而图像降噪技术可以有效地减少图像中的噪声。如下图所示,左图是一幅包含噪声的图像(图中的黑点即为噪声),右图是降噪后的结果(黑点显著减少)。
中值滤波是一种常用的图像降噪方法,对于一幅带噪声的图像 1(设分辨率为 w×h),降噪方法如下:
1)将图像1转换成灰度图,仍称为图像1;
2)新建图像2,图像2为灰度图,分辨率与图像1相同;
3)对于图像 1 中坐标为 (x,y) 的像素 p,求 p 的中值 c,然后将图像 2 中 (x,y) 处的像素值设置成 c,其中,1≤x≤w−2、1≤y≤h−2;
4)保存图像 2,图像 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)排序操作可利用列表中的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)