题目描述
小蓝有一张黑白图像,由 n×m 个像素组成,其中从上到下共 n 行,每行从左到右 m 列。每个像素由一个 0 到 255 之间的灰度值表示。
现在,小蓝准备对图像进行模糊操作,操作的方法为:
对于每个像素,将以它为中心 3×3 区域内的所有像素(可能是 9 个像素或少于 9 个像素)求和后除以这个范围内的像素个数(取下整),得到的值就是模糊后的结果。
请注意每个像素都要用原图中的灰度值计算求和。
输入描述
输入的第一行包含两个整数 n,m。
第 2 行到第 n+1 行每行包含 m 个整数,表示每个像素的灰度值,相邻整数之间用一个空格分隔。
其中,1≤n,m≤100 。
输出描述
输出 n 行,每行 m 个整数,相邻整数之间用空格分隔,表示模糊后的图像。
输入输出样例
示例 1
输入
3 4
0 0 0 255
0 0 255 0
0 30 255 255
输出
0 42 85 127
5 60 116 170
7 90 132 191
运行限制
最大运行时间:1s
最大运行内存: 128M
解析
列表切分、求均值
【一维列表切分】list[i:k]
【一维列表求均值】mean(list)
——from statistics import mean
【一维列表求最大/小值】max/min(list)
【二维列表切分】两步走,先取行再取列
matrix[:2]
[matrix[i][j:j + 2] for i in range(i, i + 2)]
二维列表切分时可以用第三方库numpy更简便,但蓝桥杯比赛时不能使用。
【二维列表求最大/小值】max(map(max, sub_matrix))
【二维列表求均值】mean(map(mean, sub_matrix))
[[1,2,3],[4,5,6],[7,8,9]]
map函数将sub_matrix里的每个列表(每行元素)映射给mean,即得到一个每个子列表平均值的列表,再次取mean求平均值。
代码
from statistics import mean
n, m = map(int, input().split())
matrix = []
for i in range(n):
sub_matrix = list(map(int, input().split()))
matrix.append(sub_matrix)
def get_mean(i, j): #坐标(i,j)
if i == 0 and j == 0:
sub_matrix = [matrix[i][j: j + 2] for i in range(i, i + 2)]
elif i == n - 1 and j == 0:
sub_matrix = [matrix[i][j: j + 2] for i in range(i - 1, i + 1)]
elif i == 0 and j == m - 1:
sub_matrix = [matrix[i][j - 1: j + 1] for i in range(i, i + 2)]
elif i == n - 1 and j == m - 1:
sub_matrix = [matrix[i][j - 1: j + 1] for i in range(i - 1, i + 1)]
elif i == 0:
sub_matrix = [matrix[i][j - 1: j + 2] for i in range(i, i + 2)]
elif i == n - 1:
sub_matrix = [matrix[i][j - 1: j + 2] for i in range(i - 1, i + 1)]
elif j == 0:
sub_matrix = [matrix[i][j: j + 2] for i in range(i - 1, i + 2)]
elif j == m - 1:
sub_matrix = [matrix[i][j - 1: j + 1] for i in range(i - 1, i + 2)]
else:
sub_matrix = [matrix[i][j - 1: j + 2] for i in range(i - 1, i + 2)]
return mean(map(mean, sub_matrix)) #二维列表求均值
for i in range(n):
for j in range(m):
print(int(get_mean(i, j)), end=" ")
print()