18188: 图像的均值滤波
http://cs101.openjudge.cn/practice/18188/
背景知识:
- 像素是指由图像的小方格组成的,这些小方块都有一个明确的位置和被分配的色彩数值,小方格颜色和位置就决定该图像所呈现出来的样子,对于灰度图而言,每个小方格即存放一个数值,即为像素值。
- 数字图像在计算机中通常以二维数组(矩阵)的形式存放,其中每个像素值,即为该数组的值。
- 图像的均值滤波操作指在图像上对目标像素给一个模板,该模板包括了其周围的临近像素以及自身,在这里我们考虑以目标像素为中心的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)))