作业要求:
读入一个24bitRGB文件(以down.rgb为例,其分辨率为256*256),输出该数据文件中R、G、B三个分量(各8bit表示)的概率分布示意图和熵。
提示:(用C或C++实现时),程序的流程为:开辟3个width*height的unsigned char型数组;打开要读出的RGB文件(以“rb”方式打开),打开3个要输出的数据统计文件(以“w”方式打开,可命名为R_sat.txt等);将RGB数据从RGB文件中读出,并分别保存到3个数组中,期间计算数据的概率分布和熵,并将这些数据写入3个数据统计txt文件中。Txt文件的写入方式为每行的两个数据用tab分开。在Excel里将这3个txt文件打开即可生成统计图。
反思:
这次编程反复折腾了很久,一直在出各种错误。之前没写检验是否打开了rgb文件的程序,也没把rgb文件放在和创建的txt一个文件夹里,导致输出熵为0还一直找不到原因。感觉自己的检纠错能力很糟糕。这种情况查看一下txt内容就可以发现数据并没有导入成功,从而意识到根本没有打开图像。希望以后多注意。
代码:
#include<stdio.h>
#include<iostream>
#include<math.h>
#include<malloc.h>
using namespace std;
const int width = 256;
const int height = 256;
int main()
{
//开辟3个数组
unsigned char R[width * height] = {
0 };
unsigned char G[width * height] = {
0 };
unsigned char B[width * height] = {
0 };
//定义指针
FILE* r1;
FILE* g1;
FILE* b1;
//打开rgb图像并创建txt文件
fopen_s(&r1, "R_sat.txt", "w");
fopen_s(&g1, "G_sat.txt", "w");
fopen_s(&b1, "B_sat.txt", "w");
FILE* pic=NULL;
fopen_s(&pic,"down.rgb" ,"rb");
if (pic == NULL)
{
printf("打不开\n");
exit(1);
}
//申请动态内存
unsigned char* buffer = NULL;
buffer = (unsigned char