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

用C++读取一个分辨率为256x256的RGB文件(24bit),其二进制形式如下:
在这里插入图片描述

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

#include<stdio.h>

#include<math.h>

#include <iostream>

#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的熵:
在这里插入图片描述

发布了5 篇原创文章 · 获赞 0 · 访问量 129

猜你喜欢

转载自blog.csdn.net/weixin_44949552/article/details/104900498