Leetcode笔记 每日一题 661. 图片平滑器 (22.03.24)

Leetcode笔记 每日一题 661. 图片平滑器 (22.03.24)

Leetcode 每日一题 661. 图片平滑器 (22.03.24)

题目

图像平滑器 是大小为 3 x 3 的过滤器,用于对图像的每个单元格平滑处理,平滑处理后单元格的值为该单元格的平均灰度。
每个单元格的平均灰度定义为:该单元格自身及其周围的 8 个单元格的平均值,结果需向下取整。(即,需要计算蓝色平滑器中 9 个单元格的平均值)。
如果一个单元格周围存在单元格缺失的情况,则计算平均灰度时不考虑缺失的单元格(即,需要计算红色平滑器中 4 个单元格的平均值)。
图片平滑器
【题目】给你一个表示图像灰度的 m x n 整数矩阵 img ,返回对图像的每个单元格平滑处理后的图像 。
示例一:
示例一

输入:img = [[1,1,1],[1,0,1],[1,1,1]]
输出:[[0, 0, 0],[0, 0, 0], [0, 0, 0]]
解释:

  • 对于点 (0,0), (0,2), (2,0), (2,2): 平均(3/4) = 平均(0.75) = 0
  • 对于点 (0,1), (1,0), (1,2), (2,1): 平均(5/6) = 平均(0.83333333) = 0
  • 对于点 (1,1): 平均(8/9) = 平均(0.88888889) = 0

示例二:
示例二

输入: img = [[100,200,100],[200,50,200],[100,200,100]]
输出: [[137,141,137],[141,138,141],[137,141,137]]
解释:

  • 对于点 (0,0), (0,2), (2,0), (2,2): floor((100+200+200+50)/4) = floor(137.5) = 137
  • 对于点 (0,1), (1,0), (1,2), (2,1): floor((200+200+50+200+100+100)/6) = floor(141.666667) = 141
  • 对于点 (1,1): floor((50+200+200+200+200+100+100+100+100)/9) = floor(138.888889) = 138

解题思路

拿题目5*5的图举例:当读取的第一个单元格[0,0]的时候,根据图片平滑器定义,我们所需计算的是1,2,6,7这四个单元格数值的平均数替换第一个单元格的值;当读取的是[1,1]的单元格的时候,我们需计算1,2,3,6,7,8,11,12,13这九个单元格数值的平均数并替换[1,1]这个单元格的值。
因此我们可以考虑遍历的算法

  • 定义res[],存放计算的平均值
  • 定义两个变量hw读取遍历img[]的高度len(img)和宽度len(img[0])
  • 当单元格为(h,w),有以下四种情况:

h-1>0:

  • w-1>0,单元格读取的范围为[h:h+2][w:w+2]
  • w-1<=0,单元格读取的范围为[h:h+2][0:w+2]

h-1<=0:

  • w-1>0,单元格读取的范围为[0:h+2][w:w+2]
  • w-1<=0,单元格读取的范围为[0:h+2][0:w+2]

Python代码

class Solution:
    def imageSmoother(self, img: List[List[int]]) -> List[List[int]]:
        res = [[None for _ in range(len(img[0]))] for _ in range(len(img)]     # 创建和输入图像大小一致的空图片
        for h in range(len(img)): # 按高度进行遍历
            for w in range(len(img[0])): #按宽度进行遍历                                     
                # 获取含单元格(h,w)一共9(4或6)个单元格组成的列表
                pixels = [pixel for row in img[max(0, h-1):h + 2] for pixel in row[max(0, w-1):w + 2]] 
                res[h][w] = sum(pixels) // len(pixels)    # 求平均并填充到结果图片中
        return res # 返回平滑后的图像
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值