1. 程式人生 > 其它 >統計rgb與yuv檔案中各分量的熵

統計rgb與yuv檔案中各分量的熵

統計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檔案但所含資訊量的密度更高。