题目描述
小蓝有一张黑白图像,由 n×m 个像素组成,其中从上到下共 n 行,每行从左到右 m 列。每个像素由一个 0 到 255 之间的灰度值表示。
现在,小蓝准备对图像进行模糊操作,操作的方法为:
对于每个像素,将以它为中心 3×3 区域内的所有像素(可能是 9 个像素或少于 9 个像素)求和后除以这个范围内的像素个数(取下整),得到的值就是模糊后的结果。
请注意每个像素都要用原图中的灰度值计算求和。
输入描述
输入的第一行包含两个整数 n, m。
第 2 行到第 n+1 行每行包含 m 个整数,表示每个像素的灰度值,相邻整数之间用一个空格分隔。
其中, 。
输出描述
输出 n 行,每行 m 个整数,相邻整数之间用空格分隔,表示模糊后的图像。
输入输出样例
输入
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
【例题分析】
【二维列表切分】
两步走,先取行再取列
1、取出第i行:matrix[i]
2、取出列需要分3种情况:
(1)四个角:只能取四个数
(2)四条边(不包括四个角):只能取六个数
(3)中间部分:可以取九个数
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)]
# 下面四条边的情况包括了上面四个点,但不需要再单独做判断去剔除四个点,if语句会将选择过的条件自动排除掉
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)]
也可以用numpy进行切分:array[:2,:2],不过蓝桥杯比赛规定只能使用标准库。
【二维列表求均值】
需要导入mean:from statistics import mean
一维列表求均值:mean(list) ,
二维列表求均值:mean( map(mean, sub_matrix))
map(function,iter):iter是可迭代对象,function是函数。对iter的每个元素都进行function操作。
【二维列表求最值】
二维列表直接使用max(list),每个子列表的元素从前到后来比较大小,比较出来大小就停止,比较不出来就接着比较下一个,直到比较出来为止。这很明显不是我们想要的。
t = [1,2,3] # max: 3
t1 = [1,2,[3]] # TypeError: '>' not supported between instances of 'list' and 'int'
t2 = [[1,2],[0,3]] # max: [1, 2]
t3 = [[1,2],[1,3]] # max: [1, 3]
t4 = [[1,2,5],[1,3]] # max: [1, 3]
t5 = [[1,3,5],[1,3]] # max: [1, 3, 5]
print(t ,'max: ',max(t))
print(t1,'max: ' ,max(t1))
print(t2,'max: ',max(t2))
print(t3, 'max: ',max(t3))
print(t4,'max: ',max(t4))
print(t5, 'max: ',max(t5))
二维列表求最大值步骤:
1、先找出子列表的最大值[max1,max2,max3,....]
2、对这些最大值再取最大值就是二维列表的最大值。
二维列表求最值:max(map(max, sub_matrix))
【代码演示】
from statistics import mean
N,M = [int(i) for i in input().split()] # 读数据:N行M列
matrix = []
for i in range(N):
sub_matrix = [int(j) for j in input().split()] # 读取N行M列的图像(列表形式)
matrix.append(sub_matrix) # 将图像存到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)]
# 下面四条边的情况包括了上面四个点,但不需要再单独做判断去剔除四个点,if语句会将选择过的条件自动排除掉
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][-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('\n',end='') # 输出一行后换行
【收获】
01、二维列表切分】
两步走,先取行再取列
# 中心点坐标:(0,0) 范围:前两行的前两列
i,j = 0,0
[matrix[i][j:j + 2] for i in range(i, i + 2)]
# 中心点坐标:(1,M-1) 范围:前三行的最后两列
i,j = 1,M-1
[matrix[i][j-1:j + 1] for i in range(i-1, i +2)]
02、二维列表求均值
需要导入mean:from statistics import mean
一维列表求均值:mean(list) ,
二维列表求均值:mean( map(mean, sub_matrix))
03、二维列表求最大值
1、先找出子列表的最大值[max1,max2,max3,....]
2、对这些最大值再取最大值就是二维列表的最大值。
二维列表求最值:max(map(max, sub_matrix))
04、 map(function,iter):
iter是可迭代对象,function是函数。对iter的每个元素都进行function操作。