【题目描述】
给定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
根据样例来看,使用的值都是输入时候的上下左右及自身,也就是左边的数在改变之后,求右边这个数的之后,不能用左边改变之后的值,而是原本的值。所以有的矩阵问题可以边求变打印,但是这个不行,必须要用第二个数组来存储。因为要保证原来的数据不会改变。
#include<iostream>
using namespace std;
#include<cmath>
int main()
{
int n = 0, m = 0;
cin >> n >> m;
//定义两个二维数组,分别存储输入时的数据和结果。
int** arr1 = new int* [n];
int** arr2 = new int* [n];
for (int i = 0; i < n; i++)
{
arr1[i] = new int[m];
arr2[i] = new int[m];
for (int j = 0; j < m; j++)
{
cin >> arr1[i][j];
//因为四周元素需要不变,可以直接让数组2完全复制数组1,后面再改变内部的数据
arr2[i][j] = arr1[i][j];
}
}
for (int i = 1; i < n - 1; i++)
{
for (int j = 1; j < m - 1; j++)
{
//使用库函数<cmath>里的round函数,可以进行四舍五入
//因为定义的整型数组,所以要除以5.0,如果除以5的话,运算的结果会直接变成整型丢弃小数,round函数也就不能起到四舍五入的作用了。
arr2[i][j] = round((arr1[i][j] + arr1[i][j - 1] + arr1[i][j + 1] + arr1[i + 1][j] + arr1[i - 1][j]) / 5.0);
}
}
//最后打印arr2数组
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
cout << arr2[i][j] << " ";
}
cout << endl;
}
}