题目链接
计算机软件能力认证考试系统http://118.190.20.162/view.page?gpid=T128
题目分析
图像的直方图在生活中很常见,在拍摄时可以辅助我们判断曝光是否合理。打开图像处理工具,选取“曲线”功能,就能看到制定颜色的直方图。
该题可以用一个二维数组存储矩阵,数组中每个元素的值表示对应像素的灰度。再用一个一维数组存储对应的直方图,该数组一开始应当把每个元素初始化为 0 。遍历整个数组时,将每一个元素的灰度加到直方图中对应位置,便可得到整个图片的直方图。
/* CCF 202104-1 灰度直方图 */
#include<iostream>
#define MAX 500 // 矩阵最大边长
using namespace std;
/*====================函数声明=====================*/
void Ori_Gray(int light,int gray[MAX]);
// 函数功能:初始化灰度直方图为 0 数组
/// 参数说明:传入灰度上限及灰度直方图数组
void Input_Array(int m, int n, int str[MAX][MAX]);
// 函数功能:输入矩阵各个元素
/// 参数说明:传入矩阵长、宽以及待输入矩阵
void Gray_Pic(int m, int n, int str[MAX][MAX], int gray[MAX]);
// 函数功能:把矩阵转换为灰度直方图
// 调用该函数前请确保 gray 数组已经初始化!
/// 参数说明:传入矩阵长、宽、矩阵本身以及空的灰度图数组
/*====================声明结束=====================*/
int main(int argc, char* argv[])
{
int m, n, light; // 长、宽和灰度
int str[MAX][MAX]; // 存储图片的矩阵
int gray[MAX]; // 存储灰度图
cin >>m>>n>>light;
Input_Array(m,n,str);
Ori_Gray(light,gray);
Gray_Pic(m,n,str,gray);
for(int i=0;i<light;i++)
{
cout <<gray[i]<<" ";
}
return 0;
}
/*====================函数实现=====================*/
void Gray_Pic(int m, int n, int str[MAX][MAX], int gray[MAX])
/// 函数功能:把矩阵转换为灰度图
/// 参数说明:传入矩阵长、宽、矩阵本身以及空的灰度图数组
{
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
int t = str[i][j];
gray[t] += 1;
}
}
return;
}
void Input_Array(int m, int n, int str[MAX][MAX])
// 函数功能:输入矩阵各个元素
{
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
cin >>str[i][j];
}
}
}
void Ori_Gray(int light,int gray[MAX])
// 函数功能:初始化灰度直方图为 0 数组
/// 参数说明:传入灰度上限及灰度直方图数组
{
for(int i=0;i<light;i++)
{
gray[i] = 0;
}
return;
}