#include<stdio.h>
#include<iostream>
#include<math.h>
using namespace std;
int Height = 256;
int Width = 256;
int main()
{
unsigned char R[65536] = { 0 };
unsigned char G[65536] = { 0 };
unsigned char B[65536] = { 0 };
//R、G、B分量
double fre_R[256] = { 0 };
double fre_G[256] = { 0 };
double fre_B[256] = { 0 };
//计算频率
double entropy_R = 0;
double entropy_G = 0;
double entropy_B = 0;
//计算分量的熵
FILE* Image;
fopen_s(&Image, "C:/Users/86137/Desktop/数据压缩/test/test.rgb", "rb");
//打开rgb文件
FILE* Red;
FILE* Green;
FILE* Blue;
fopen_s(&Red, "C:/Users/86137/Desktop/数据压缩/test/Red.txt", "w");
fopen_s(&Green, "C:/Users/86137/Desktop/数据压缩/test/Green.txt", "w");
fopen_s(&Blue, "C:/Users/86137/Desktop/数据压缩/test/Blue.txt", "w");
//创建新的txt文件
unsigned char buffer[196608];
fread(buffer, 1, 196607, Image);
for (int i = 0, j = 0; i < 196608; i = i + 3, j++)
{
B[j] = *(buffer + i);
G[j] = *(buffer + i + 1);
R[j] = *(buffer + i + 2);
//分别读取R、G、B三个分量到数组中
}
for (int i = 0; i < 256; i++)
{
for (int j = 0; j < 65536; j++)
{
if (int(R[j] == i))
{
fre_R[i]++;
}
}
}
for (int i = 0; i < 256; i++)
{
for (int j = 0; j < 65536; j++)
{
if (int(G[j] == i))
{
fre_G[i]++;
}
}
}
for (int i = 0; i < 256; i++)
{
for (int j = 0; j < 65536; j++)
{
if (int(B[j] == i))
{
fre_B[i]++;
}
}
}
for (int i = 0; i < 256; i++)
{
fre_R[i] = fre_R[i] / double(Height * Width);
fre_B[i] = fre_B[i] / double(Height * Width);
fre_G[i] = fre_G[i] / double(Height * Width);
}
for (int i = 0; i < 256; i++)
{
if (fre_R[i] != 0)
{
entropy_R += -fre_R[i] * log(fre_R[i]) / log(2);
}
}
for (int i = 0; i < 256; i++)
{
if (fre_G[i] != 0)
{
entropy_G += -fre_G[i] * log(fre_G[i]) / log(2);
}
}
for (int i = 0; i < 256; i++)
{
if (fre_B[i] != 0)
{
entropy_B += -fre_B[i] * log(fre_B[i]) / log(2);
}
}
cout << "R的熵为" << entropy_R << endl;
cout << "G的熵为" << entropy_G << endl;
cout << "B的熵为" << entropy_B << endl;
//分别计算R、G、B的频率和熵
//写入文件
fprintf(Red, "数值\t概率\n");
for (int i = 0; i < 256; i++)
{
fprintf(Red, "%d\t%f\n", i, fre_R[i]);
}
fprintf(Green, "数值\t概率\n");
for (int i = 0; i < 256; i++)
{
fprintf(Green, "%d\t%f\n", i, fre_G[i]);
}
fprintf(Blue, "数值\t概率\n");
for (int i = 0; i < 256; i++)
{
fprintf(Blue, "%d\t%f\n", i, fre_B[i]);
}
fclose(Image);
fclose(Red);
fclose(Green);
fclose(Blue);
return 0;
}
实验结果: