图像平滑器 是大小为 3 x 3 的过滤器,用于对图像的每个单元格平滑处理,平滑处理后单元格的值为该单元格的平均灰度。
每个单元格的 平均灰度 定义为:该单元格自身及其周围的 8 个单元格的平均值,结果需向下取整。(即,需要计算蓝色平滑器中 9 个单元格的平均值)。
如果一个单元格周围存在单元格缺失的情况,则计算平均灰度时不考虑缺失的单元格(即,需要计算红色平滑器中 4 个单元格的平均值)。
class Solution {
public:
vector<vector<int>> imageSmoother(vector<vector<int>>& img) {
vector<vector<int>> result;
result=img;
int val;
if(img.size()==1){
if(img[0].size()==1) return result;
for(int i=0;i<img[0].size();i++){
if(i==0){
val=(img[0][i]+img[0][i+1])/2;
}
else if(i==img[0].size()-1){
val=(img[0][i]+img[0][i-1])/2;
}
else
val=(img[0][i+1]+img[0][i]+img[0][i-1])/3;
result[0][i]=val;
}
return result;
}
if(img[0].size()==1){
for(int i=0;i<img.size();i++){
if(i==0){
val=(img[i][0]+img[i+1][0])/2;
}
else if(i==img.size()-1){
val=(img[i][0]+img[i-1][0])/2;
}
else
val=(img[i+1][0]+img[i][0]+img[i-1][0])/3;
result[i][0]=val;
}
return result;
}
for(int i=0;i<img.size();i++){
for(int j=0;j<img[0].size();j++){
if(i==0&&j==0){ //左上
val=(img[i][j]+img[i][j+1]+img[i+1][j]+img[i+1][j+1])/4;
}
else if(i<img.size()-1&&j==0){ //左
val=(img[i-1][j]+img[i-1][j+1]+img[i][j]+img[i][j+1]+img[i+1][j]+img[i+1][j+1])/6;
}
else if(i==img.size()-1&&j==0){//左下
val=(img[i-1][j]+img[i-1][j+1]+img[i][j]+img[i][j+1])/4;
}
else if(i==0&&j<img[0].size()-1){//上
val=(img[i][j-1]+img[i+1][j-1]+img[i][j]+img[i][j+1]+img[i+1][j]+img[i+1][j+1])/6;
}
else if(i==0&&j==img[0].size()-1){//右上
val=(img[i][j-1]+img[i+1][j-1]+img[i][j]+img[i+1][j])/4;
}
else if(i<img.size()-1&&j==img[0].size()-1){//右
val=(img[i][j-1]+img[i+1][j-1]+img[i][j]+img[i+1][j]+img[i-1][j-1]+img[i-1][j])/6;
}
else if(i==img.size()-1&&j==img[0].size()-1){//右下
val=(img[i][j-1]+img[i][j]+img[i-1][j-1]+img[i-1][j])/4;
}
else if(i==img.size()-1&&j<img[0].size()-1){//下
val=(img[i][j-1]+img[i][j]+img[i-1][j-1]+img[i-1][j]+img[i-1][j+1]+img[i][j+1])/6;
}
else{
val=(img[i][j-1]+img[i+1][j-1]+img[i][j]+img[i+1][j]+img[i-1][j-1]+img[i-1][j]+img[i-1][j+1]+img[i][j+1]+img[i+1][j+1])/9;
}
result[i][j]=val;
}
}
return result;
}
};
我写的太麻烦了,还要考虑单行单列单个元素三种情况
class Solution(object):
def imageSmoother(self, M):
"""
:type M: List[List[int]]
:rtype: List[List[int]]
"""
#padding
m = len(M[0])
N = [[0.5]+i+[0.5] for i in M]
N = [[0.5]*(m+2)] + N + [[0.5]*(m+2)]
#卷积
for i in range(1,len(N)-1):
for j in range(1,len(N[0])-1):
total = [N[i-1][j-1],N[i][j-1],N[i+1][j-1],N[i-1][j],N[i][j],N[i+1][j],N[i-1][j+1],N[i][j+1],N[i+1][j+1]]
sums,k = 0,0
for _ in total:
if _ != 0.5:
sums += _
else:
k += 1
M[i-1][j-1] = int(sums/(9-k))
return M