題目
難度:★★☆☆☆
類型:幾何,二維數(shù)組
包含整數(shù)的二維矩陣 M 表示一個圖片的灰度。你需要設(shè)計一個平滑器來讓每一個單元的灰度成為平均灰度 (向下舍入) ,平均灰度的計算是周圍的8個單元和它本身的值求平均,如果周圍的單元格不足八個,則盡可能多的利用它們。
注意
給定矩陣中的整數(shù)范圍為 [0, 255]。
矩陣的長和寬的范圍均為 [1, 150]。
示例
輸入:
[[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
解答
本題難點在于如何尋找每個點的平滑域,即某一點P(h, w)周圍的9個點,此外,還要考慮P在圖片邊上或角上的情況,分別對應(yīng)6個點和4個點,因此需要增加對索引進(jìn)行判斷的過程。
class Solution:
def imageSmoother(self, M):
height, width = len(M), len(M[0]) # 獲得圖像的高和寬
res = [[None for _ in range(width)] for _ in range(height)] # 創(chuàng)建和輸入圖像大小一致的空圖片
for h in range(height): # 按行遍歷
for w in range(width): # 按列遍歷
# 當(dāng)前點為(h, w),對其周圍3*3方格內(nèi)的點取平均,作為平滑后的該點值
region_pixels = [pixel for row in M[max(0, h-1):h + 2] for pixel in row[max(0, w-1):w + 2]] # 9(4或6)個點組成的列表
res[h][w] = sum(region_pixels) // len(region_pixels) # 求平均并填充到結(jié)果圖片中
return res # 返回平滑后的圖像
如有疑問或建議,歡迎評論區(qū)留言~