- 任务要求
- 参考答案
- 重置记录
- 评论
任务描述
本关任务:编写一个能对图像进行几何均值滤波的小程序。
相关知识
通过本关的学习,你讲要掌握: 1、滤波器; 2、均值类滤波器; 3、算法均值滤波器的 python 实现。
滤波器
噪声的本质是污染了图像上的原来的点,把它们的像素值修改了,从而让图像看起来模糊,显然这不是我们想要的。而滤波器,就是用来去掉图像上的噪声的函数。
滤波器的种类有很多,比如均值类滤波器,排序统计类滤波器,选择性滤波器等,它们的区别就是使用不同的数学方法去除噪声。需要说明的是,使用滤波器去除噪声达不到百分之百还原原始图像的目的,但是滤波器能够大幅度的消除图像上的噪声,使得图像的观赏性提高很多。
均值类滤波器
均值类滤波器是一种非常简单的滤波器。它首先需要定义大小,比如3x3
:
然后,遍历图像中的每一个像素点,将滤波器覆盖上去,以中间的灰色的点恰好覆盖在当前的像素点上,则计算滤波器覆盖到的区域的像素点的像素值的均值(算数均值或者几何均值),像上面这种滤波器,则计算的是周围的9
个像素点的均值,最后用这个均值替代当前点的像素值。
均值滤波器有很多种,区别是计算均值的方式不同,其它的都相同。
算数均值滤波器
算数均值滤波器就是计算滤波器区域内的像素点的算数均值。
几何均值滤波器
几何均值滤波器的公式如下:
就是把滤波器内点像素值相乘,然后取一个指数值(mn
表示滤波器内像素点的个数)。
谐波均值滤波器
谐波均值滤波器的公式如下:
就是把滤波器内点像素值的倒数相加,然后再用像素点的个数去除以这个相加的和。
篇幅所限,下面我们只介绍算数均值滤波器的实现,其它的都差不多,实现起来并不难。
算数均值滤波器的python
实现
程序
算数均值滤波器的程序如下所示:
# 导入opencv包
import cv2
# 导入numpy包
import numpy as np
# 使用opencv读取灰度图
image = cv2.imread("zao.png", cv2.IMREAD_GRAYSCALE)
# 待输出的图片
output = np.zeros(image.shape, np.uint8)
# 遍历图像,进行均值滤波
for i in range(image.shape[0]):
for j in range(image.shape[1]):
# 滤波器内像素值的和
sum = 0
# 遍历滤波器内的像素值
for m in range(-1, 2):
for n in range(-1, 2):
# 防止越界
if 0 <= i + m < image.shape[0] and 0 <= j + n < image.shape[1]:
# 像素值求和
sum += image[i + m][j + n]
# 求均值,作为最终的像素值
output[i][j] = int(sum / 9)
# 展示均值滤波后的图片
cv2.imshow("after filter.png", output)
# 等待用户的键盘输入
cv2.waitKey()
运行结果
首先是原始的未经污染的图片:
然后是用椒盐噪声污染的图片:
可以看到,图片中多了一些白色和黑色的点 最后是滤波器过滤后的结果:
虽然图像变得模糊了,但是椒盐噪声点基本被去除了。
编程要求
根据提示,在右侧编辑器Begin
和End
之间补充代码,完成对图片src
的几何均值滤波的实现,滤波器的大小是1*3
,滤波后的结果图片保存到output
。
测试说明
平台会测试几何均值滤波后的打印结果。
开始你的任务吧,祝你成功!
# 导入 numpy 包
import numpy as np
# 导入 opencv 包
import cv2
import math
# 使用 opencv 读取图片
image = cv2.imread("/data/workspace/myshixun/step2/原图/zao.png", cv2.IMREAD_GRAYSCALE)
# 待输出的图片
output = np.zeros(image.shape, np.uint8)
# 遍历图像,进行均值滤波
for i in range(image.shape[0]):
for j in range(image.shape[1]):
# 初始化几何均值变量
ji = 1.0
# 遍历滤波器内的像素值,滤波器的大小为 1*3
for k in range(-1, 2):
# 防止越界
if 0 <= j + k < image.shape[1]:
# 像素值相乘
ji *= image[i][j + k]
# 计算几何均值
output[i][j] = int(math.pow(ji, 1.0 / 3))
# 展示均值滤波后的图片
cv2.imwrite("/data/workspace/myshixun/step2/学员文件/output.png", output)
# 等待用户的键盘输入
print(output)
print(np.sum(output))