蓝桥杯每日一更001之图像模糊

本专栏代码地址 https://github.com/xiawei20161308104/lanqiaobei
本节代码路径 lanqiaobei/others/xiangcheng.py

文章目录

  • 原题
  • 分析
  • 代码+注释

原题

题目描述
小蓝有一张黑白图像,由 n×m 个像素组成,其中从上到下共 n 行,每行从左到右 m 列。每个像素由一个 0到255 之间的灰度值表示。
现在,小蓝准备对图像进行模糊操作,操作的方法为:
对于每个像素,将以它为中心3✖3区域内的所有像素(可能是9个像素或少于9个像素)求和后除以这个范围内的像素个数(取下整),得到的值就是模糊后的结果.
请注意每个像素都要用原图中的灰度值计算求和。
输入描述
输入的第一行包含两个整数n,m。
第2行到第n+1 行每行包含m 个整数,表示每个像素的灰度值,相邻整数之间用一个空格分隔。
输出描述
输出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

分析

若有一个3✖3的像素,“图像模糊”过程如图。题目所讲的“图像模糊”其实就是卷积操作/平滑滤波啦。
两种情况:

  1. 如像素点1,不够9个像素。
  2. 如像素点5,足够9个像素。
    蓝桥杯每日一更001之图像模糊_第1张图片

解题要点:

  1. 熟练读取二维矩阵
  2. 将计算结构存入二维矩阵
  3. 判断每个像素由几个有效像素点组成,如图的红叉就是无效点

代码+注释

def avg(x, y):
    # 记录周围总的像素和
    s = 0
    # 记录有多少个像素
    cnt = 0
    # 循环遍历位置为当前位置的左一个和右一个,写成范围就是左减一和右加二,因为range左闭右开。
    for i in range(x - 1, x + 1 + 1):
        for j in range(y - 1, y + 1 + 1):
            # 判断坐标的合法性,n为行数,转为坐标第n行坐标应该是n-1,所以坐标最大就到n-1,遂而取值0<=i
            if 0 <= i < n and 0 <= j < m:
                # 周围像素累加
                s += matrix[i][j]
                # 记录像素个数
                cnt += 1
    # 返回均值,即为模糊之后的像素。题目要求下取整。
    return s // cnt

# 从第一个位置开始遍历求均值
img = [[avg(i, j) for j in range(m)] for i in range(n)]
# 按照行遍历新生成的“模糊图像”
for l in img:
    # [5, 60, 116, 170]
    print(l)
    # *号的作用是传入任意个数变量,这里用来打印刚好。
    # 5 60 116 170
    print(*l)

你可能感兴趣的:(蓝桥杯,蓝桥杯,python,算法)