题目:读入一个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;
}
结果如下: