蓝桥杯刷题009——图像模糊

题目描述

 

小蓝有一张黑白图像,由 n×m 个像素组成,其中从上到下共 n 行,每行从左到右 m 列。每个像素由一个 0 到 255 之间的灰度值表示。

现在,小蓝准备对图像进行模糊操作,操作的方法为:

对于每个像素,将以它为中心 3×3 区域内的所有像素(可能是 9 个像素或少于 9 个像素)求和后除以这个范围内的像素个数(取下整),得到的值就是模糊后的结果。

请注意每个像素都要用原图中的灰度值计算求和。

输入描述

输入的第一行包含两个整数 n, m。

第 2 行到第 n+1 行每行包含 m 个整数,表示每个像素的灰度值,相邻整数之间用一个空格分隔。

其中,1 \leq n, m \leq 100 。

输出描述

输出 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操作。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小叶pyか

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值