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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值