数据压缩实验1
观察元音的时域和频域波形
a:
时域:
频域:
o:
时域:
频域:
e:
时域:
频域:
计算 .rgb文件三个通道各自的熵
#include<iostream>
#include<math.h>
using namespace std;
int main()
{
unsigned char R[256*256] = { 0 }, G[256*256] = { 0 }, B[256*256] = { 0 },img[256*256*3] = { 0 };//定义R、G、B、img量
double Rp[256] = { 0 }, Gp[256] = { 0 }, Bp[256] = { 0 }; //定义R、G、B概率分量
double R2 = 0, G2 = 0, B2 = 0; //定义R、G、B的熵
FILE* fp = fopen("D:\\理工大魔王\\教材+PPT+作业\\数据压缩\\test.rgb", "rb");
fread(img, sizeof(unsigned char), 256*256*3, fp);//sizeof()计算文件大小是否为宽×高×3
fclose(fp);
//fread将三通道图像数据读入成为一维数组,此处将其按序分配到三个一维数组中
for (int i = 0;i < 256*256; i++)
{
B[i] = img[3*i];
G[i] = img[3*i+1];
R[i] = img[3*i+2];
}
//分别统计R、G、B三通道的颜色强度级的频数
for (int i = 0; i < 256*256; i++)
{
Rp[R[i]]++;
Gp[G[i]]++;
Bp[B[i]]++;
}
//分别计算R、G、B三通道的256个颜色强度级的概率
for (int i = 0; i < 256; i++)
{
Rp[i] = Rp[i] / (256*256);
Gp[i] = Gp[i] / (256*256);
Bp[i] = Bp[i] / (256*256);
}
//建立概率文件
FILE* dr = fopen("D:\\理工大魔王\\教材+PPT+作业\\数据压缩\\zuoye1\\R.txt","w");//建立存放Y数据
FILE* dg = fopen("D:\\理工大魔王\\教材+PPT+作业\\数据压缩\\zuoye1\\G.txt","w");//建立存放U数据
FILE* db = fopen("D:\\理工大魔王\\教材+PPT+作业\\数据压缩\\zuoye1\\B.txt","w");//建立存放V数据
//将概率写入文件
for (int i = 0; i < 256; i++)
{
fprintf(dr, "%d\t%f\n", i, Rp[i]);
fprintf(dg, "%d\t%f\n", i, Gp[i]);
fprintf(db, "%d\t%f\n", i, Bp[i]);
}
//计算并输出熵(根据熵的计算公式)
for (int i = 0; i < 256; i++)
{
if (Rp[i] != 0) { R2 += -Rp[i] * log(Rp[i]) / log(2.0); }//换底公式!!!
if (Gp[i] != 0) { G2 += -Gp[i] * log(Gp[i]) / log(2.0); }
if (Bp[i] != 0) { B2 += -Bp[i] * log(Bp[i]) / log(2.0); }
}
fprintf(dr,"R的熵 = %f",R2);//输出B的熵
fprintf(dg,"G的熵 = %f",G2);//输出G的熵
fprintf(db,"B的熵 = %f",B2);//输出R的熵
return 0;
}
计算结果: