向上取整,向下取整,四舍五入

 

6. 图像模糊处理 点击打开链接

描述

给定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. 在第一个代码中,数组要设置为double类型,如果不设置为double类型,只能对一半的数据;或者

double sum = (a[i-1][j] + a[i][j-1] + a[i][j] + a[i][j+1] + a[i+1][j])/5.0 

c此时数组就可以用整型了。

原理,a/b的结果一直是向下取整,没有得到小数,所以需要对a或者b进行强制类型转换。

2. 平均数要舍入到最近的整数。可以用+0.5四舍五入。

不能用ceil,ceil向上取整,ceil(7.3)=8,而不是四舍五入。

floor和int的作用一样,向下取整。floor(7.8)=7   int(7.8)=7;

ceil(x)返回不小于x的最小整数值(然后转换为double型)。
floor(x)返回不大于x的最大整数值。

round(x)返回x的四舍五入整数值。

可以用round。但最好还是用+0.5的方法。

百度百科:Round函数返回一个数值,该数值是按照指定的小数位数进行四舍五入运算的结果。可是当保留位跟着的即使是5,有可能进位,也有可能舍去,机会各50%。这样就会造成在应用程序中计算有误。


#include
#include
#define MAXN 100
#define MAXM 100
double a[MAXN+10][MAXM+10]; 
double c[MAXN+10][MAXM+10]; //不能定义为int型 
using namespace std;
int main()
{
	int n, m;
	cin >> n >> m;
	for(int i = 1; i <= n; ++i)
	{
		for(int j = 1; j <= m; ++j)
		{
			cin >> a[i][j];
			c[i][j] = a[i][j];
		}
	}
	for(int i = 2; i <= n-1; ++i)
	{
		for(int j = 2; j <= m-1; ++j)
		{
			double sum = (a[i-1][j] + a[i][j-1] + a[i][j] + a[i][j+1] + a[i+1][j])/5;//sum要为double类型 
			sum = int(sum + 0.5);
			c[i][j] = sum;
		}
	} 
	for(int i = 1; i <= n; ++i)
	{
		for(int j = 1; j <= m; ++j)
		{
			cout << c[i][j] << " ";
		}
		cout << endl;
	}
	return 0;
		 
} 
#include
#include
#define MAXN 100
#define MAXM 100
int a[MAXN+10][MAXM+10]; 
int c[MAXN+10][MAXM+10];  
using namespace std;
int main()
{
	int n, m;
	cin >> n >> m;
	for(int i = 1; i <= n; ++i)
	{
		for(int j = 1; j <= m; ++j)
		{
			cin >> a[i][j];
			c[i][j] = a[i][j];
		}
	}
	for(int i = 2; i <= n-1; ++i)
	{
		for(int j = 2; j <= m-1; ++j)
		{
			double sum = (a[i-1][j] + a[i][j-1] + a[i][j] + a[i][j+1] + a[i+1][j])/5.0;//sum要为double类型,用5.0或者前面那一串*1.0. 
			sum = int(sum + 0.5);
			c[i][j] = sum;
		}
	} 
	for(int i = 1; i <= n; ++i)
	{
		for(int j = 1; j <= m; ++j)
		{
			cout << c[i][j] << " ";
		}
		cout << endl;
	}
	return 0;
		 
} 

用round四舍五入的方法
#include 
#include
using namespace std;
#define N 105
int a[N][N];
int b[N][N];
 
int main() {
	int n, m;
	cin >> n >> m;
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++) {
			cin >> a[i][j];
			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] = round((a[i - 1][j] + a[i + 1][j] + a[i][j]
				+ a[i][j - 1] + a[i][j + 1])*1.0 / 5);
	}
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m ; j++)
			cout << b[i][j] << " ";
		cout << endl;
	}
 
	return 0;
}


你可能感兴趣的:(竞赛知识点)