一、作业要求
对down.rgb和down.yuv分析三个通道的概率分布,并计算各自的熵。(编程实现)
- 两个文件的分辨率均为256 * 256
- yuv文件为4:2:0采样空间。YUV格式按照全部像素的Y数据块、U数据块和V数据块依次存放。
- 存储格式为:rgb文件按每个像素BGR分量依次存放;
本文采用 C++ 编写
二、思路分析
1.RGB
rgb 文件中每个像素都按照 BGR 依次存放,则为BGRBGRBGRBGR…循环,由图像分辨率256 * 256可得,此 rgb 文件共有 256 * 256 * 3 = 196608个像素。
2.YUV
yuv 文件是 4:2:0 的采样空间,即每四个Y分量共用一个 UV 分量。
是基于平面模式进行存储。即先存储所有的 Y 分量,然后存储所有的 U 分量,最后 V 分量。
图片来源于网络
-
y分量所占为256 * 256 = 65536
-
u分量:
首:256 * 256 = 65536
尾:256 * 256 *(1+1/4)= 81920 -
v分量:
首:256 * 256 *(1+1/4)= 81920
尾:256 * 256 *(1+1/2)= 98304
三、代码
1.rgb
#include<iostream>
#include<stdio.h>
#include<math.h>
using namespace std;
//定义图像的分辨率
//256*256=65536
int height=256;
int wide=256;
int main()
{
//定义R、G、B分量
unsigned char R[65536]={
0};
unsigned char G[65536]={
0};
unsigned char B[65536]={
0};
//定义数量
double R_num[256]={
0};
double G_num[256]={
0};
double B_num[256]={
0};
//定义频率
double R_fre[256]={
0};
double G_fre[256]={
0};
double B_fre[256]={
0};
//定义RGB分量的熵
double R_shang=0;
double G_shang=0;
double B_shang=0;
//定义文件指针
//打开所给的RGB图像文件
FILE* image;
fopen_s(&image,"C:\\Users\\Zhao Zhuo\\Desktop\\down.rgb", "rb");
//定义文件RGB指针
FILE* Red;
FILE* Green;
FILE* Blue;
//定义最终存储数据的txt文档
fopen_s(&Red,"C:\\Users\\Zhao Zhuo\\Desktop\\Red.txt", "w");
fopen_s(&Green,"C:\\Users\\Zhao Zhuo\\Desktop\\Green.txt", "w");
fopen_s(&Blue,"C:\\Users\\Zhao Zhuo\\Desktop\\Blue.txt", "w");
//256*256*3=196608
unsigned char buffer[196608];
fread(buffer,sizeof(unsigned char),196608,image);
for(int i=0,j=0;</