概述
图像熵:图像熵是一种特征的统计形式,它反映了图像中平均信息量的多少。
图像熵越大,所蕴含的信息越多。
同理,BGR中信息熵大的,所蕴含的信息更多。
一、公式
二、思路
具体实现思路如下:
1.统计B G R中0~255值出现的频次
代码如下:
for (int h = 0; h < 256; h++)
{
int i = 0;
for (int w = 0; w < 256 * 3; w = w + 3)
{
*(B_buffer + h * 256 + i) = *(rgb + h * 256 * 3 + w);
*(G_buffer + h * 256 + i) = *(rgb + h * 256 * 3 + w + 1);
*(R_buffer + h * 256 + i) = *(rgb + h * 256 * 3 + w + 2);
i++;
}
}//将图像中的rgb值分别存放在 * B_buffer, * G_buffer, * R_buffer中;
for (int g = 0; g < 256; g++)
{
for (int j = 0; j < 256 * 256; j++)
{
if (*(B_buffer+j) == g)
{
B_count[g] ++;
}
if (*(G_buffer + j) == g)
{
G_count[g] ++;
}
if (*(R_buffer + j) == g)
{
R_count[g] ++;
}
}
}//遍历3个指针,分别统计B,G,R中0~255这些值出现的次数,其遍历的次数应该是:
//B,G,R的大小256*256基础上*256就是[0,255]的值
for (int t = 0; t < 256; t++)
{
B_count[t] = B_count[t] / (256 * 256);
G_count[t] = G_count[t] / (256 * 256);
R_count[t] = R_count[t] / (256 * 256);
}//统计B,G,R中0~255这些值的频率
2.利用公式计算BGR的熵
代码如下:
for (int n = 0; n < 256; n++)
{
if ( *(B_count + n) != 0)
{
B_H[n] = -B_count[n] * (log(B_count[n]) / log(2.0));
}
if ( *(G_count + n) != 0)
{
G_H[n] = -G_count[n] * (log(G_count[n]) / log(2.0));
}
if ( *(R_count + n) != 0)
{
R_H[n] = -R_count[n] * (log(R_count[n]) / log(2.0));
}
}//计算单个值的熵
for (int sum = 0; sum < 256; sum++)
{
BH += B_H[sum];
GH += G_H[sum];
RH += R_H[sum];
}//计算B,G,R的总熵;
总结
B的熵为6.85686
G的熵为7.17846
R的熵为7.22955
完整代码如下:
#include<iostream>
#include<stdio.h>
#include<math.h>
using namespace std;
int main()
{
FILE* test;
test = fopen("F:\\大三下资料\\数据压缩\\test.rgb", "rb");
unsigned char* rgb, * B_buffer, * G_buffer, * R_buffer;
rgb = (unsigned char*)malloc(256 * 256 * 3 * sizeof(unsigned char));
B_buffer = (unsigned char*)malloc(256 * 256 * sizeof(unsigned char));
G_buffer = (unsigned char*)malloc(256 * 256 * sizeof(unsigned char));
R_buffer = (unsigned char*)malloc(256 * 256 * sizeof(unsigned char));
double B_count[256] = { 0 };
double G_count[256] = { 0 };
double R_count[256] = { 0 };
double B_H[256] = { 0 };
double G_H[256] = { 0 };
double R_H[256] = { 0 };
double BH = 0;
double GH = 0;
double RH = 0;
fread(rgb, 1, 256 * 256 * 3, test);
for (int h = 0; h < 256; h++)
{
int i = 0;
for (int w = 0; w < 256 * 3; w = w + 3)
{
*(B_buffer + h * 256 + i) = *(rgb + h * 256 * 3 + w);
*(G_buffer + h * 256 + i) = *(rgb + h * 256 * 3 + w + 1);
*(R_buffer + h * 256 + i) = *(rgb + h * 256 * 3 + w + 2);
i++;
}
}//将图像中的rgb值分别存放在 * B_buffer, * G_buffer, * R_buffer中;
for (int g = 0; g < 256; g++)
{
for (int j = 0; j < 256 * 256; j++)
{
if (*(B_buffer+j) == g)
{
B_count[g] ++;
}
if (*(G_buffer + j) == g)
{
G_count[g] ++;
}
if (*(R_buffer + j) == g)
{
R_count[g] ++;
}
}
}//遍历3个指针,分别统计B,G,R中0~255这些值出现的次数,其遍历的次数应该是:
//B,G,R的大小256*256基础上*256就是[0,255]的值
for (int t = 0; t < 256; t++)
{
B_count[t] = B_count[t] / (256 * 256);
G_count[t] = G_count[t] / (256 * 256);
R_count[t] = R_count[t] / (256 * 256);
}//统计B,G,R中0~255这些值的频率
for (int n = 0; n < 256; n++)
{
if ( *(B_count + n) != 0)
{
B_H[n] = -B_count[n] * (log(B_count[n]) / log(2.0));
}
if ( *(G_count + n) != 0)
{
G_H[n] = -G_count[n] * (log(G_count[n]) / log(2.0));
}
if ( *(R_count + n) != 0)
{
R_H[n] = -R_count[n] * (log(R_count[n]) / log(2.0));
}
}//计算单个值的熵
for (int sum = 0; sum < 256; sum++)
{
BH += B_H[sum];
GH += G_H[sum];
RH += R_H[sum];
}//计算B,G,R的总熵;
cout << "B的熵为" << BH << endl;
cout << "G的熵为" << GH << endl;
cout << "R的熵为" << RH << endl;
}