#include<iostream>
#include<string.h>
#include<stdio.h>
#include <fstream>
using namespace std;
char cvs_name[256 * 256] = "E:\\学习资料\\1数据压缩原理与应用\\第一周作业\\Answer.cvs";
const int maxn = 256 * 256;
int R[256 * 256], G[256 * 256], B[256 * 256];
double R_sum[260], G_sum[260], B_sum[260];
int r = 0, g = 0, b = 0;
int main()
{
//读取文件
FILE* fp1 = fopen("E:\\学习资料\\1数据压缩原理与应用\\第一周作业\\test.rgb", "rb");
if (fp1 == NULL)
{
cout << "seed.yuv打开失败";
return 0;
}
unsigned char* RGB;
RGB = (unsigned char*)malloc(256 * 256 * 3 * sizeof(unsigned char));
if (RGB == NULL)
{
cout << "分配空间失败";
return 0;
}
fread(RGB, 256 * 256 * 3, 1, fp1);
//将RGB分离(BGR)
for (int i = 0; i < 256 * 256 * 3; i++)
{
if (i % 3 == 0)
{
B[i / 3] = int(*(RGB + i));
b++;
}
if (i % 3 == 1)
{
G[i / 3] = int(*(RGB + i));
g++;
}
if (i % 3 == 2)
{
R[i / 3] = int(*(RGB + i));
r++;
}
}
//统计RGB的分布列
memset(R_sum, 0.0, sizeof(double) * 260);
memset(G_sum, 0.0, sizeof(double) * 260);
memset(B_sum, 0.0, sizeof(double) * 260);
for (int i = 0; i < 256 * 256; i++)
{
R_sum[R[i]]++;
G_sum[G[i]]++;
B_sum[B[i]]++;
}
//计算概率
for (int i = 0; i < 256; i++)
{
R_sum[i] = R_sum[i] / maxn;
G_sum[i] = G_sum[i] / maxn;
B_sum[i] = B_sum[i] / maxn;
}
//计算熵
double entropy_R = 0.0, entropy_G = 0.0, entropy_B = 0.0;
for (int i = 0; i < 256; i++)
{
if (R_sum[i] != 0)
entropy_R -= (R_sum[i] * log(R_sum[i]) / log(2));
if (G_sum[i] != 0)
entropy_G -= (G_sum[i] * log(G_sum[i]) / log(2));
if (B_sum[i] != 0)
entropy_B -= (B_sum[i] * log(B_sum[i]) / log(2));
}
cout << "R_entropy = " << entropy_R << endl;
cout << "G_entropy = " << entropy_G << endl;
cout << "B_entropy = " << entropy_B << endl;
//写入结果到.cvs
ofstream oFile;
oFile.open(cvs_name, ios::out | ios::trunc);
oFile << "Value" << "," << "R" << "," << "G" << "," << "B" << endl;
for (int i = 0; i < 256; i++)
oFile << i << "," << R_sum[i] << "," << G_sum[i] << "," << B_sum[i] << endl;
oFile << "Class" << "," << "Entropy" << endl;
oFile << "R" << "," << entropy_R << endl;
oFile << "G" << "," << entropy_G << endl;
oFile << "B" << "," << entropy_B << endl;
fclose(fp1);
free(RGB);
return 0;
}
结果如下:
R —— 7.22955
G —— 7.17846
B —— 6.85686