Skip to content

18188: 图像的均值滤波

http://cs101.openjudge.cn/practice/18188/

背景知识:

  1. 像素是指由图像的小方格组成的,这些小方块都有一个明确的位置和被分配的色彩数值,小方格颜色和位置就决定该图像所呈现出来的样子,对于灰度图而言,每个小方格即存放一个数值,即为像素值。
  2. 数字图像在计算机中通常以二维数组(矩阵)的形式存放,其中每个像素值,即为该数组的值。
  3. 图像的均值滤波操作指在图像上对目标像素给一个模板,该模板包括了其周围的临近像素以及自身,在这里我们考虑以目标像素为中心的8个像素,这时我们用模板中的全体像素的平均值来代替原来目标像素值,得到的结果即为图像均值滤波后的结果。

题目要求: 实现图像的均值滤波:

给定一张输入图像,得到其均值滤波后的结果,得到的均值结果若是浮点数则向下取整。比如一个像素点均值为2.5,则结果为2。

边界点的像素只考虑在图像内部的。比如左上角的点邻居只有3个分别是右边,下边,和右下。

输入

首先为M和N两个正整数,表示图像有M行N列。 接下来的M行每行有N个正整数代表输入图像的像素。

输出

M行N列的二维数组,即经过均值滤波后的结果。

样例输入

Sample Input 1:
3 3
2 3 2
3 2 1
1 1 1

Sample Output1:
2 2 2
2 1 1
1 1 1

解释:
考虑图像每个像素:
对于下标为(0,0)点,输入像素值为2,输出计算为(2+3+3+2)/ 4 = 2.5 -> 2
对于下标为(0,1)点,输入像素值为3,输出计算为 (2+3+2+3+2+1) / 6 = 2.17->2
对于下标为(1,1)点,输入像素值为2, 输出计算为  (2+3+2+3+2+1+1+1+1) / 9 = 1.78->1
对于下标为(2,2)点,输入像素值为1,输出计算为(2+1+1+1)/ 4 = 1.25 -> 1

样例输出

Sample Input2:
3 4
2 3 2 4
3 2 1 1
1 1 1 1

Sample Output2:
2 2 2 2
2 1 1 1
1 1 1 1

来源

cs101-2018

python
def mean_filter(image):
    M = len(image)
    N = len(image[0])
    result = [[0] * N for _ in range(M)]

    directions = [(-1, -1), (-1, 0), (-1, 1),
                  (0, -1), (0, 0), (0, 1),
                  (1, -1), (1, 0), (1, 1)]
    
    for i in range(M):
        for j in range(N):
            sum_val = 0
            count = 0
            for di, dj in directions:
                ni, nj = i + di, j + dj
                if 0 <= ni < M and 0 <= nj < N:
                    sum_val += image[ni][nj]
                    count += 1
            result[i][j] = sum_val // count
    
    return result

# 读取输入
M, N = map(int, input().split())
image = [list(map(int, input().split())) for _ in range(M)]

# 应用均值滤波
filtered_image = mean_filter(image)

# 输出结果
for row in filtered_image:
    print(' '.join(map(str, row)))