bmp概率文件分布

题目:读入一个24bitRGB文件(以down.rgb为例,其分辨率为256*256),输出该数据文件中R、G、B三个分量(各8bit表示)的概率分布示意图和熵。

主要程序

#include"iostream"
#include"stdio.h"
#include"math.h"
int W;
int H;
int imgsize;
using namespace std;
void outandcalcu(unsigned char* A, FILE* saveA){
   int i=0;
   double freq[256];
   int j=0;
   int frecount=0;
   double entropy=0;
   for(i; i<256; i++){
       j=0;
       frecount=0;
       for(j; j<imgsize/3; j++){
           if((int)A[j]==i){
               frecount++;
           }
       }
       freq[i]=((double)frecount/((double)imgsize/3));
       if(freq[i]!=0){
           entropy+=(-freq[i])*log(freq[i])/log(2);
       }
   }
   fprintf(saveA,"Symbol\tFrequency\n");
for(i=0; i<256; i++)
{
 fprintf(saveA, "%-3d\t%-8.2e\n", i, freq[i]);
}
fprintf(saveA, "%.4lf", entropy);
}
int main(){
   const char* origimg="E:\\数据压缩作业\\down.rgb";
   const char* rimg="E:\\数据压缩作业\\R_sat.txt";
   const char* gimg="E:\\数据压缩作业\\G_sat.txt";
   const char* bimg="E:\\数据压缩作业\\B_sat.txt";
   W=256;
   H=256;
   imgsize=W*H*3;
   int i=0;
   unsigned char* img=new unsigned char[imgsize];
   unsigned char* R=new unsigned char[imgsize/3];
   unsigned char* G=new unsigned char[imgsize/3];
   unsigned char* B=new unsigned char[imgsize/3];
   
   FILE* openimg=fopen(origimg, "rb");
   FILE* saveR=fopen(rimg,"w");
   FILE* saveG=fopen(gimg,"w");
   FILE* saveB=fopen(bimg,"w");
   if(openimg==NULL){cout<<"false"<<endl;}
   
   fread(img, sizeof(unsigned char), imgsize, openimg);
   for(i; i<imgsize/3; i++){
       B[i]=img[3*i];
       G[i]=img[3*i+1];
       R[i]=img[3*i+2];
   }
   outandcalcu(R,saveR);
   outandcalcu(G,saveG);
   outandcalcu(B,saveB);
   cout<<"success"<<endl;
}

结果如下:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值