信息学奥赛一本通(c++):1128:图像模糊处理
一、题目
1128:图像模糊处理
时间限制: 1000 ms 内存限制: 65536 KB
【题目描述】
给定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<iostream>
#include<cmath>
using namespace std;
int main()
{
int n,m;
cin>>n>>m;
int a[n][m];
double b[n][m];
for(int i=0; i<n; i++)
{
for(int j=0; j<m; j++)
{
cin>>a[i][j];
if(i==n-1||i==0||j==0||j==m-1)
{
b[i][j]=a[i][j];
}
}
}
for(int i=1; i<n-1; i++)
{
for(int j=1; j<m-1; j++)
{
b[i][j]=(a[i][j]+a[i-1][j]+a[i+1][j]+a[i][j-1]+a[i][j+1])/5.0;
}
}
for(int i=0; i<n; i++)
{
for(int j=0; j<m; j++)
{
cout<<round(b[i][j])<<" ";
}
cout<<endl;
}
return 0;
}