C++读取一个RGB文件,并统计其R\G\B三个分量的概率数据和熵
用C++读取一个分辨率为256x256的RGB文件(24bit),其二进制形式如下:
现用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;
}
程序调试结果:
其中BLUE分量的输出结果如图:
用excel生成的柱状图如下:
RGB的熵: