第1关:均值类滤波器

  • 任务要求
  • 参考答案
  • 重置记录
  • 评论

任务描述

本关任务:编写一个能对图像进行几何均值滤波的小程序。

相关知识

通过本关的学习,你讲要掌握: 1、滤波器; 2、均值类滤波器; 3、算法均值滤波器的 python 实现。

滤波器

噪声的本质是污染了图像上的原来的点,把它们的像素值修改了,从而让图像看起来模糊,显然这不是我们想要的。而滤波器,就是用来去掉图像上的噪声的函数。

滤波器的种类有很多,比如均值类滤波器,排序统计类滤波器,选择性滤波器等,它们的区别就是使用不同的数学方法去除噪声。需要说明的是,使用滤波器去除噪声达不到百分之百还原原始图像的目的,但是滤波器能够大幅度的消除图像上的噪声,使得图像的观赏性提高很多。

均值类滤波器

均值类滤波器是一种非常简单的滤波器。它首先需要定义大小,比如3x3

,

然后,遍历图像中的每一个像素点,将滤波器覆盖上去,以中间的灰色的点恰好覆盖在当前的像素点上,则计算滤波器覆盖到的区域的像素点的像素值的均值(算数均值或者几何均值),像上面这种滤波器,则计算的是周围的9个像素点的均值,最后用这个均值替代当前点的像素值。

均值滤波器有很多种,区别是计算均值的方式不同,其它的都相同。

算数均值滤波器

算数均值滤波器就是计算滤波器区域内的像素点的算数均值。

几何均值滤波器

几何均值滤波器的公式如下:

,

就是把滤波器内点像素值相乘,然后取一个指数值(mn表示滤波器内像素点的个数)。

谐波均值滤波器

谐波均值滤波器的公式如下:

,

就是把滤波器内点像素值的倒数相加,然后再用像素点的个数去除以这个相加的和。

篇幅所限,下面我们只介绍算数均值滤波器的实现,其它的都差不多,实现起来并不难。

算数均值滤波器的python实现
程序

算数均值滤波器的程序如下所示:

 
  1. # 导入opencv包
  2. import cv2
  3. # 导入numpy包
  4. import numpy as np
  5. # 使用opencv读取灰度图
  6. image = cv2.imread("zao.png", cv2.IMREAD_GRAYSCALE)
  7. # 待输出的图片
  8. output = np.zeros(image.shape, np.uint8)
  9. # 遍历图像,进行均值滤波
  10. for i in range(image.shape[0]):
  11. for j in range(image.shape[1]):
  12. # 滤波器内像素值的和
  13. sum = 0
  14. # 遍历滤波器内的像素值
  15. for m in range(-1, 2):
  16. for n in range(-1, 2):
  17. # 防止越界
  18. if 0 <= i + m < image.shape[0] and 0 <= j + n < image.shape[1]:
  19. # 像素值求和
  20. sum += image[i + m][j + n]
  21. # 求均值,作为最终的像素值
  22. output[i][j] = int(sum / 9)
  23. # 展示均值滤波后的图片
  24. cv2.imshow("after filter.png", output)
  25. # 等待用户的键盘输入
  26. cv2.waitKey()
运行结果

首先是原始的未经污染的图片:

,

然后是用椒盐噪声污染的图片:

,

可以看到,图片中多了一些白色和黑色的点 最后是滤波器过滤后的结果:

,

虽然图像变得模糊了,但是椒盐噪声点基本被去除了。

编程要求

根据提示,在右侧编辑器BeginEnd之间补充代码,完成对图片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))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值