C++读取一个RGB文件,并统计其R\G\B三个分量的概率数据和熵

用C++读取一个分辨率为256x256的RGB文件(24bit),其二进制形式如下:
C++读取一个RGB文件,并统计其R\G\B三个分量的概率数据和熵

现用C++编程实现对其文件的读取,RGB分量的数据概率统计,计算RGB的熵值,并将统计的结果输入到TXT文件中,C++代码实现如下:

#include<stdio.h>

#include<math.h>

#include

#pragma warning(disable:4996);

int main()

{

const int width = 256;const int height = 256;int b=0;int g=0;int r=0;

unsigned char buffer[3* width*height];

unsigned char red[width*height] = { 0 };

unsigned char green[width*height] = { 0 };

unsigned char blue[width*height] = { 0 };

FILE *fp;

fp = fopen(“down.rgb”,“rb”);

if (fp == NULL)

printf(“Open file error!\n”);

else

printf(“File opened!\n”);//打开文件

fread(buffer, sizeof(unsigned char), 3 * width*height, fp);

for (int i = 0; i < 3 * width*height; i++)

{

if (i % 3 == 0)

{

blue[b] = buffer[i];

b++;

}

else if (i % 3 == 1)

{

green[g] = buffer[i];

g++;

}

else if (i % 3 == 2)

{

red[r] = buffer[i];

r++;

}

}//将RGB的值分别存放在单独的数组中

int bt[256]={0};int gt[256]={0};int rt[256]={0};

for (int i = 0; i < 256; i++)

{

for (int j = 0; j < width*height; j++)

{

if (i == blue[j])

bt[i]++;

if (i == green[j])

gt[i]++;

if (i == red[j])

rt[i]++;

}

}//统计RGB值出现的次数

double freqr[256] = { 0 };

double freqg[256] = { 0 };

double freqb[256] = { 0 };

for (int i = 0; i < 256; i++)

{

freqr[i] = double(rt[i]) / (width*height);

freqg[i] = double(gt[i]) / (width*height);

freqb[i] = double(bt[i]) / (width*height);

}//计算出现的频率

double hr = 0;double hg = 0;double hb = 0;

for (int i = 0; i < 256; i++)

{

if(freqr[i]!=0)

hr = hr -freqr[i] *log(freqr[i]) / log(2);

if (freqg[i] != 0)

hg = hg -freqg[i] * log(freqg[i]) / log(2);

if (freqb[i]!= 0)

hb = hb -freqb[i] * log(freqb[i]) / log(2);

}//计算RGB的熵

FILE *RF;FILE *GF;FILE *BF;

if ((RF = fopen(“red.txt”, “w”)) == NULL)

printf(“fail\n”);

else

printf(“red success\n”);

if ((GF = fopen(“green.txt”, “w”)) == NULL)

printf(“fail\n”);

else

printf(“green success\n”);

if ((BF = fopen(“blue.txt”, “w”)) == NULL)

printf(“fail\n”);

else

printf(“blue success\n”);//以“w”方式创建TXT文件

char s[] = “symbol\tfrequency\n”;

fprintf(RF,s);fprintf(GF, s);fprintf(BF, s);

for (int i = 0;i < 256; i++)

{

fprintf(BF,"%d\t%f\n",i, freqb[i]);

fprintf(GF,"%d\t%f\n",i, freqg[i]);

fprintf(RF,"%d\t%f\n",i, freqr[i]);

}

fprintf(BF,“entropy = %f”,hb);

fprintf(GF,“entropy = %f”,hg);

fprintf(RF,“entropy = %f”,hr);//将数据写入TXT文件

fclose(fp);

fclose(BF);

fclose(GF);

fclose(RF);

return 0;

}
程序调试结果:
C++读取一个RGB文件,并统计其R\G\B三个分量的概率数据和熵
其中BLUE分量的输出结果如图:
C++读取一个RGB文件,并统计其R\G\B三个分量的概率数据和熵
用excel生成的柱状图如下:
C++读取一个RGB文件,并统计其R\G\B三个分量的概率数据和熵

C++读取一个RGB文件,并统计其R\G\B三个分量的概率数据和熵
C++读取一个RGB文件,并统计其R\G\B三个分量的概率数据和熵
RGB的熵:
C++读取一个RGB文件,并统计其R\G\B三个分量的概率数据和熵