提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
一、作业题目
对down.rgb和down.yuv文件分析,分辨率均为256*256,YUV为4:2:0,rgb文件按照每个像素BGR分量依次存放,YUV按照全部像素的Y数据块、U数据块、V数据块依次存放。
二、解决思路
将RGB/YUV数据计入到一个数组中,读取各个分量频数,除以256*256得到频率,根据熵的公式计算出信息熵。
1. 具体实现
代码如下:
#include <iostream>
#include <math.h>
using namespace std;
int main()
{
FILE* fp1, * fp2;
double Hy = 0.0, Hu = 0.0, Hv = 0.0, Hr = 0.0, Hg = 0.0, Hb = 0.0;
unsigned char* buffer0 = new unsigned char[256 * 256 * 1.5];
unsigned char* buffer1 = new unsigned char[256 * 256 * 3];
double buffer0y[256]{}, buffer0u[256]{}, buffer0v[256]{}, buffer1r[256]{}, buffer1g[256]{}, buffer1b[256]{};
fopen_s(&fp1, "down.yuv", "rb");
fopen_s(&fp2, "down.rgb", "rb");
fread(buffer0, sizeof(unsigned char), 256 * 256 * 1.5, fp1);//将文件YUV数据存放到buffer0中
for (int i = 0; i < (256 * 256); i++)//yuv分量按照全部像素的Y数据块、U数据块、V数据块依次存放
{
buffer0y[buffer0[i]]++;//频数加一
}
for (int j = 0;j < 256;j++)
{
buffer0y[j] = buffer0y[j] / (256 * 256);//y分量频率
if (buffer0y[j] != 0)
{
Hy = Hy + buffer0y[j] * log2(1 / buffer0y[j]);//Y通道熵
}
}
for (int i = (256 * 256); i < (256 * 256 * 1.25); i++)
{
buffer0u[buffer0[i]]++;
buffer0v[buffer0[i + 16384]]++;
}
for (int j = 0;j < 256;j++)
{
buffer0u[j] = buffer0u[j] / (256 * 256 * 0.25);
if (buffer0u[j] != 0)
{
Hu = Hu + buffer0u[j] * log2(1 / buffer0u[j]);
}
buffer0v[j] = buffer0v[j] / (256 * 256 * 0.25);
if (buffer0v[j] != 0)
{
Hv = Hv + buffer0v[j] * log2(1 / buffer0v[j]);
}
}
fread(buffer1, sizeof(unsigned char), 256 * 256 * 3, fp2);//将rgb数据存放到buffer1中
for (int i = 0; i < (256 * 256); i++)
{//bgr分量依次存放
buffer1r[buffer1[i * 3]]++;
buffer1g[buffer1[i * 3 + 1]]++;
buffer1b[buffer1[i * 3 + 2]]++;
}
for (int j = 0;j < 256;j++)
{
buffer1r[j] = buffer1r[j] / (256 * 256);
if (buffer1r[j] != 0)
{
Hr = Hr + buffer1r[j] * log2(1 / buffer1r[j]);
}
buffer1g[j] = buffer1g[j] / (256 * 256);
if (buffer1g[j] != 0)
{
Hg = Hg + buffer1g[j] * log2(1 / buffer1g[j]);
}
buffer1b[j] = buffer1b[j] / (256 * 256);
if (buffer1b[j] != 0)
{
Hb = Hb + buffer1b[j] * log2(1 / buffer1b[j]);
}
}
fclose(fp1);
fclose(fp2);
cout << "R通道的熵为" << Hr << endl;
cout << "G通道的熵为" << Hg << endl;
cout << "B通道的熵为" << Hb << endl;
cout << "Y通道的熵为" << Hy << endl;
cout << "U通道的熵为" << Hu << endl;
cout << "V通道的熵为" << Hv << endl;
return (0);
}
2.结果
H(x) | 计算值 |
---|---|
Hr | 6.86 |
Hg | 7.18 |
Hb | 7.22 |
Hy | 6.33 |
Hu | 5.12 |
Hv | 4.11 |
三、总结归纳
1)对图片格式的知识要熟练才能思路清晰(就是不清晰导致时间花费太多),对信息熵的计算知识不能丢。
2)编写程序可以参照上学期数字视音频处理课程中对文件的读写等技。
3)csdn发表博客流程不太熟悉,力求做出更好的版面。