题目要求
编程实现RGB文件三通道分量的熵计算。
该测试文件分辨率为256×256,数据格式为每个像素占用3字节,BGRBGR…保存。拿到文件可以先计算一下文件大小是否为宽×高×3字节。
熵的计算公式
cpp代码实现
#include<iostream>
#include<stdio.h>
#include<math.h>
using namespace std;
#pragma warning(disable:4996);
int main()
{
FILE* test;//设置文件指针
test = fopen("D://作业//shujuyasuo//作业1//test.rgb", "rb");//打开文件
unsigned char buffer[256 * 256 * 3];//每个像素3字节,共256*256*3字节
fread(buffer, 1, 256 * 256 * 3, test);
//RGB分量
unsigned char R[256 * 256] = { 0 };
unsigned char G[256 * 256] = { 0 };
unsigned char B[256 * 256] = { 0 };
//RGB数量
double Rnum[256] = { 0 };
double Gnum[256] = { 0 };
double Bnum[256] = { 0 };
//RGB频率
double fr[256] = { 0 };
double fg[256] = { 0 };
double fb[256] = { 0 };
//RGB熵
double sr = 0;
double sg = 0;
double sb = 0;
//文件按BGR BGR排列,按照顺序将文件中对应的分量进行存储
for (int i = 0, j = 0; j < 256 * 256 * 3; i++, j = j + 3)
{
B[i] = *(buffer + j);//j
G[i] = *(buffer + j + 1);//j+1
R[i] = *(buffer + j + 2);//j+2
}
//计算分量的数量
for (int i = 0; i < 256; i++)
{
for (int j = 0; j < 256 * 256; j++)
{
if (int(R[j] == i))//j遍历,与i相同存储,可计算分量数量
{
Rnum[i]++;
}
if (int(G[j] == i))
{
Gnum[i]++;
}
if (int(B[j] == i))
{
Bnum[i]++;
}
}
}
//计算各分量的频率
for (int i = 0; i < 256; i++)
{
fr[i] = Rnum[i] / (256 * 256);
fg[i] = Gnum[i] / (256 * 256);
fb[i] = Bnum[i] / (256 * 256);
}
//计算分量的熵,用公式计算
for (int i = 0; i < 256; i++)
{
if (fr[i] != 0)
{
sr += -fr[i] * log(fr[i]) / log(double(2));
}
if (fg[i] != 0)
{
sg += -fg[i] * log(fg[i]) / log(double(2));
}
if (fb[i] != 0)
{
sb += -fb[i] * log(fb[i]) / log(double(2));
}
}
cout << "R的熵为:" << sr << endl;
cout << "G的熵为:" << sg << endl;
cout << "B的熵为:" << sb << endl;
return 0;
}
结果