测试文件test.rgb分辨率为256*256,数据格式为每个像素占用3字节,BGRBGR...保存。
用C++语言计算R、G、B三通道分量的熵:
图像熵表示为图像灰度级集合的比特平均数,单位比特/像素,也描述了图像信源的平均信息量。
计算公式:
1.读取源文件:
test = fopen("D:\\大三下\\数据压缩\\作业1\\test.rgb", "rb");
注:VS2019一般需修改配置才能正常运行,修改方式如下:在整个项目里生效,依次选择:属性-配置属性-C/C++ -预处理器-预处理器定义-编辑
附上一行:_CRT_SECURE_NO_WARNINGS
(参考:VS中设置#define _CRT_SECURE_NO_WARNINGS的两种方式 - 你好中国 - 博客园
2. 计算公式中所需次数m:
for (int g = 0; g < 256; g++)
{
for (int j = 0; j < 256 * 256; j++)
{
if (*(Bbuffer + j) == g)
{
Bf[g] ++;
}
if (*(Gbuffer + j) == g)
{
Gf[g] ++;
}
if (*(Rbuffer + j) == g)
{
Rf[g] ++;
}
}
}
3.计算公式中所需概率P:
for (int m = 0; m < 256; m++)
{
Bf[m] = Bf[m] / (256 * 256);
Gf[m] = Gf[m] / (256 * 256);
Rf[m] = Rf[m] / (256 * 256);
}
4.带入公式计算熵值:
for (int n = 0; n < 256; n++)
{
if (*(Bf + n) != 0)
{
B1[n] = -Bf[n] * (log(Bf[n]) / log(2.0));
}
if (*(Gf + n) != 0)
{
G1[n] = -Gf[n] * (log(Gf[n]) / log(2.0));
}
if (*(Rf + n) != 0)
{
R1[n] = -Rf[n] * (log(Rf[n]) / log(2.0));
}
}
for (int sum = 0; sum < 256; sum++)
{
Bs += B1[sum];
Gs += G1[sum];
Rs += R1[sum];
}
完整代码如下:
#include<iostream>
#include<stdio.h>
#include<math.h>
using namespace std;
int main()
{
FILE* test;
test = fopen("D:\\大三下\\数据压缩\\作业1\\test.rgb", "rb");
unsigned char* rgb, * Bbuffer, * Gbuffer, * Rbuffer;
rgb = (unsigned char*)malloc(256 * 256 * 3 * sizeof(unsigned char));
Bbuffer = (unsigned char*)malloc(256 * 256 * sizeof(unsigned char));
Gbuffer = (unsigned char*)malloc(256 * 256 * sizeof(unsigned char));
Rbuffer = (unsigned char*)malloc(256 * 256 * sizeof(unsigned char));
double Rf[256] = { 0 };
double Gf[256] = { 0 };
double Bf[256] = { 0 };
double R1[256] = { 0 };
double G1[256] = { 0 };
double B1[256] = { 0 };
double Bs = 0;
double Gs = 0;
double Rs = 0;
fread(rgb, 1, 256 * 256 * 3, test);
//将文件中的rgb值分别存放在 * B_buffer, * G_buffer, * R_buffer中;
for (int h = 0; h < 256; h++)
{
int i = 0;
for (int w = 0; w < 256 * 3; w = w + 3)
{
*(Bbuffer + h * 256 + i) = *(rgb + h * 256 * 3 + w);
*(Gbuffer + h * 256 + i) = *(rgb + h * 256 * 3 + w + 1);
*(Rbuffer + h * 256 + i) = *(rgb + h * 256 * 3 + w + 2);
i++;
}
}
//统计B,G,R中0~255出现的次数
for (int g = 0; g < 256; g++)
{
for (int j = 0; j < 256 * 256; j++)
{
if (*(Bbuffer + j) == g)
{
Bf[g] ++;
}
if (*(Gbuffer + j) == g)
{
Gf[g] ++;
}
if (*(Rbuffer + j) == g)
{
Rf[g] ++;
}
}
}
//统计B,G,R中0~255这些值的概率
for (int m = 0; m < 256; m++)
{
Bf[m] = Bf[m] / (256 * 256);
Gf[m] = Gf[m] / (256 * 256);
Rf[m] = Rf[m] / (256 * 256);
}
//计算单个熵
for (int n = 0; n < 256; n++)
{
if (*(Bf + n) != 0)
{
B1[n] = -Bf[n] * (log(Bf[n]) / log(2.0));
}
if (*(Gf + n) != 0)
{
G1[n] = -Gf[n] * (log(Gf[n]) / log(2.0));
}
if (*(Rf + n) != 0)
{
R1[n] = -Rf[n] * (log(Rf[n]) / log(2.0));
}
}
//计算B,G,R的熵;
for (int sum = 0; sum < 256; sum++)
{
Bs += B1[sum];
Gs += G1[sum];
Rs += R1[sum];
}
cout << "R的熵为:" << Rs << endl;
cout << "G的熵为:" << Gs << endl;
cout << "B的熵为:" << Bs << endl;
}
运行结果: