总时间限制: 1000ms 内存限制: 65536kB
描述
给定n行m列的图像各像素点的灰度值,要求用如下方法对其进行模糊化处理:
1. 四周最外侧的像素点灰度值不变;
2. 中间各像素点新灰度值为该像素点及其上下左右相邻四个像素点原灰度值的平均(舍入到最接近的整数)。
输入
第一行包含两个整数n和m,表示图像包含像素点的行数和列数。1 <= n <= 100,1 <= m <= 100。
接下来n行,每行m个整数,表示图像的每个像素点灰度。相邻两个整数之间用单个空格隔开,每个元素均在0~255之间。
输出
n行,每行m个整数,为模糊处理后的图像。相邻两个整数之间用单个空格隔开。
样例输入
4 5
100 0 100 0 50
50 100 200 0 0
50 50 100 100 200
100 100 50 50 100
样例输出
100 0 100 0 50
50 80 100 60 0
50 80 100 90 200
100 100 50 50 100
思路:循环遍历二维数组,遇到中间像素点,则计算其新的值,并将值存放新的二维数组中。
解题:
1、定义两个二维数组,存放输入的数据,一个用来遍历获取周围的数并计算新的数据,并把计算得出的新数据存放到新的数组中。
2.计算平均数,结果四舍五入
程序:
#include
#include
using namespace std;
#define Max 101
void init(int [][Max],int [][Max]);//初始化数组
void input(int [][Max],int [][Max],int*,int*);//输入数据
void output(int [][Max],int,int);//输出数据
void search(int [][Max],int [][Max],int,int);//寻找中间的像素
int average(int,int,int,int,int);//计算平均值
int main(){
int a[Max][Max];
int b[Max][Max];
int n,m;
init(a,b);
input(a,b,&n,&m);
search(a,b,n,m);
// cout<> *n >> *m;
int row = *n;
int col = *m;
for(int i = 0; i> a[i][j];
b[i][j] = a[i][j];
}
}
}
void search(int a[][Max],int b[][Max],int row, int col){
for(int i = 1;i < row-1; i++){
for(int j = 1;j < col-1 ;j++){
int avg = average(a[i][j],a[i][j-1],a[i][j+1],a[i-1][j],a[i+1][j]);
b[i][j] = avg;
}
}
}
int average(int mid,int a,int b,int c,int d){
double avg = (mid + a + b + c + d)*1.0/5.0;
int avg_min = (mid + a + b + c + d)/5;
int res = -1;
//四舍五入
if(avg - avg_min < 0.5){
res = avg_min;
}else{
res = avg_min + 1;
}
return res;
}
更新:
四舍五入部分优化:
int average(int mid,int a,int b,int c,int d){
double avg = (mid + a + b + c + d)*1.0/5.0+0.5;
int avgnear = avg; //四舍五入
return avgnear;
}