統計rgb與yuv檔案中各分量的熵
阿新 • • 發佈:2021-03-10
統計rgb與yuv檔案中各分量的熵
要求
對群裡發的down.rgb和down.yuv分析三個通道的概率分佈,並計算各自的熵。
提示
兩個檔案的解析度均為256*256,yuv為4:2:0取樣空間,儲存格式為:rgb檔案按每個畫素BGR分量依次存放;YUV格式按照全部畫素的Y資料塊、U資料塊和V資料塊依次存放。
程式碼
#include<iostream>
#include<fstream>
using namespace std;
#define height 256
#define width 256
#define size 65536
void H_RGB(unsigned char* buffer)
{
FILE* fp;
float level_r[256] = { 0 };
float level_g[256] = { 0 };
float level_b[256] = { 0 };
float Hr = 0, Hg = 0, Hb = 0;
fopen_s(&fp, "C:\\Users\\tonym\\Desktop\\down.rgb", "rb");
if (fp == 0)
return;
fread(buffer, size * 3, 1, fp);
for (int i = 0; i < size * 3; i)
{
level_b[buffer[i++]] ++;
level_g[buffer[i++]] ++;
level_r[buffer[i++]] ++;
}
for (int i = 0; i < 256; i++)
{
if (level_b[i] / 65536 != 0)
Hb = Hb - (level_b[i] / 65536) * (log(level_b[i] / 65536) / (log(2)) );
if (level_g[i] / 65536 != 0)
Hg = Hg - (level_g[ i] / 65536) * (log(level_g[i] / 65536) / (log(2)) );
if (level_r[i] / 65536 != 0)
Hr = Hr - (level_r[i] / 65536) * (log(level_r[i] / 65536) / (log(2)) );
}
printf("Hr=%f\nHg=%f\nHb=%f\n", Hr, Hg, Hb);
}
float H_YUV(unsigned char* buffer,int len)
{
float level[256] = { 0 };
float H=0;
for (int i = 0; i < len; i)
{
level[buffer[i++]] ++;
}
for (int i = 0; i < 256; i++)
{
if (level[i] / len != 0)
H = H - (level[i] / len) * (log(level[i] / len) / (log(2)));
}
return H;
}
int main()
{
int level_RGB[256] = { 0 };
float sum_RGB[256];
unsigned char* RGB_buffer;
unsigned char* YUV_buffer1, * YUV_buffer2, * YUV_buffer3;
RGB_buffer = new unsigned char[size * 3];
YUV_buffer1 = new unsigned char[size];
YUV_buffer2 = new unsigned char[size/4];
YUV_buffer3 = new unsigned char[size/4];
FILE* fp_yuv;
fopen_s(&fp_yuv, "C:\\Users\\tonym\\Desktop\\down.yuv", "rb");
if (fp_yuv == 0)
return 0;
fread(YUV_buffer1, 65536, 1, fp_yuv);
fread(YUV_buffer2, 16384, 1, fp_yuv);
fread(YUV_buffer3, 16384, 1, fp_yuv);
H_RGB(RGB_buffer);
printf("Hy=%f\n", H_YUV(YUV_buffer1, 65536));
printf("Hu=%f\n", H_YUV(YUV_buffer2, 16384));
printf("Hv=%f\n", H_YUV(YUV_buffer3, 16384));
return 0;
}
結果
分析
yuv檔案中各分量的熵小於rgb中各分量的熵,說明rgb檔案雖然體積大於4:2:0取樣格式的yuv檔案但所含資訊量的密度更高。