统计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文件但所含信息量的密度更高。
總結
以上是生活随笔為你收集整理的统计rgb与yuv文件中各分量的熵的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 那些年我在CSDN追过的安全白帽师傅,r
- 下一篇: 编写彩色空间转换程序:YUVtoRGB
