计算RGB、YUV文件的熵值

news/2024/7/21 7:11:37 标签: 图像处理

对课程中的down.rgb和down.yuv分析三个通道的概率分布,并计算各自的熵。(编程实现)

个文件的分辨率均为256*256,yuv为4:2:0采样空间,存储格式为:rgb文件按每个像素BGR分量依次存放;YUV格式按照全部像素的Y数据块、U数据块和V数据块依次存放。

对于down.rgb及分配率,数据量为0-256*256

int main(void)
{
//定义指针、分量数组、读入数据输出数据
 FILE *picture_rgb=NULL; 
 FILE *R=NULL;  
 FILE *G=NULL;
 FILE *B=NULL;

//定义各分量数组
unsigned char *RGB_buffer = NULL;
RGB_buffer=(unsigned char *)malloc(sizeof(unsigned char)*3*width*height);
unsigned char Rr[width*height]={0};  
unsigned char Gg[width*height]={0};
unsigned char Bb[width*height]={0};

int data1;
data1=fopen_s(&picture_rgb,"C:\\Users\\16203\\Desktop\\down.rgb","rb"); //open down.rgb
fopen_s(&R,"C:\\Users\\16203\\Desktop\\R_out.txt","w");
fopen_s(&G,"C:\\Users\\16203\\Desktop\\G_out.txt","w");
fopen_s(&B,"C:\\Users\\16203\\Desktop\\B_out.txt","w");
fread(RGB_buffer,sizeof(unsigned char),3*width*height,picture_rgb); 

//读取文件值:
 int a=0;
 int r=0;
 int g=0;
 int b=0;

 for(a;a<3*width*height;a++)
 {
  if(a%3==0)
  {
   Bb[b]=*(RGB_buffer+a);
   b++;
  }
  else if(a%3==1)
  {
   Gg[g]=*(RGB_buffer+a);
   g++;
  }
  else  if(a%3==2)
  {
   Rr[r]=*(RGB_buffer+a);
   r++;
  }
 }

 //计算分量熵值
double H_R=0;
double H_G=0;
double H_B=0;
 for(int i=0;i<256;i++)
 {
  if(Rre[i]!=0)
  {
   H_R=H_R-Rre[i]*(log(Rre[i])/log(double(2)));
  }
  //以2为底对数熵公式
  if(Gre[i]!=0)
  {
   H_G=H_G-Gre[i]*(log(Gre[i])/log(double(2)));
  }
  if(Bre[i]!=0)
  {
   H_B=H_B-Bre[i]*(log(Bre[i])/log(double(2)));
  }
 }
 printf("熵R=%f\n",H_R);
 printf("熵G=%f\n",H_G);
 printf("熵B=%f\n",H_B);
   

YUV文件

//定义指针、分量数组、读入数据输出数据
int main(void)
{
	FILE *picture_yuv=NULL;
	FILE *Y;
	FILE *U;
	FILE *V;
//定义各分量数组
unsigned char *YUV_buffer = (unsigned char *)malloc(sizeof(unsigned char) *1.5*width*height); 
unsigned char Yy[width*height]={0};
unsigned char Uu[width*height/4]={0};
unsigned char Vv[width*height/4]={0};

fopen_s(&picture_yuv,"down.yuv","rb");
fopen_s(&Y,"Y_out.txt","w");
fopen_s(&U,"U_out.txt","w");
fopen_s(&V,"V_out.txt","w");
fread(YUV_buffer,sizeof(unsigned char),1.5*width*height,picture_yuv);	

//读取文件值
int y=0;
int u=0;
int v=0;
for(int a=0,b=0;a<width*height;a++,b++)
	{
		Yy[b]=YUV_buffer[a];
	}
for(int a=width*height, b=0;a<width*height*1.25;a++,b++)
	{
		Uu[a]=YUV_buffer[a];
	}
	for(int a=width*height*1.25, b=0;a<width*height*1.5;a++,b++)
	{
		Vv[b]=YUV_buffer[a];
	}
//计算分量熵值
double H_Y=0;
double H_U=0;
double H_V=0;
	for(int i=0;i<256;i++)
	{
		if(Yre[i]!=0)
		{
			H_Y=H_Y-Yre[i]*(log(Yre[i])/log(double(2)));
		}
		if(Ure[i]!=0)
		{
			H_U=H_U-Ure[i]*(log(Ure[i])/log(double(2)));
		}
		if(Vre[i]!=0)
		{
			H_V=H_V-Vre[i]*(log(Vre[i])/log(double(2)));
		}
	}
	printf("熵Y=%f\n",H_Y);
	printf("熵U=%f\n",H_U);
	printf("熵V=%f\n",H_V);

结果得:

熵R=7.2 bit/symbol
熵G=7.2 bit/symbol
熵B=6.9 bit/symbol

熵Y=6.3 bit/symbol
熵U=5.1 bit/symbol
熵V=4.1 bit/symbol


http://www.niftyadmin.cn/n/792318.html

相关文章

dll导出def出错

问题&#xff1a;只导出getServerObjects 1&#xff0c;无错误&#xff0c;添加updateServiceObject后报错&#xff0c; dll 的def文件如下&#xff1a; 1 LIBRARY "lbcd" 2 3 EXPORTS 4 getServerObjects 1 5 updateServiceObject 2 错误如下&#xff1a; …

javacv实现实时视频截图和录像服务easyCV,支持png,jpg截图以及gif,apng动态图片录制

本项目维护于github&#xff1a;https://github.com/eguid/easyCV 更新日志 2019年4月更新&#xff1a; 1、新增两个springbootpostgre的演示demo 2、去除了corelib录像API中不合理的持久层接口 1、介绍 本项目的截图库基于ffmpeg&#xff0c;录像库基于javaCV1.4.x。 …

TGA文件格式分析和图片举例

首先据查阅资料显示&#xff1a; TGA扩展文件结构&#xff08;v2.0&#xff09;由五部分组成&#xff1a;文件头、图像/颜色表数据、开发者自定义区域、扩展区域和文件尾。其中V2.0版本的文件头和图像/颜色表数据与V1.0保持一致。 1、文件头&#xff08;TGA File Header&…

RGB2YUV相互转换实验

rgb2yuv 实验思路&#xff1a; main函数关键代码&#xff1a; #include <stdio.h> #include <stdlib.h> #include <malloc.h> #include "rgb2yuv.h" #define u_int8_t unsigned __int8 #define u_int unsigned __int32 #define u_int32_t un…

WPF使用声音资源

1.在项目上右键&#xff0c;增加Resources文件夹&#xff1b;在Resources文件夹上右键&#xff0c;增加Audio文件夹&#xff1b;往Audio文件夹中增加声音资源文件&#xff1a;didi.wav。 2.右键didi.wav&#xff0c;选择属性&#xff0c;设置属性复制到输出目录为始终复制&…

javaCV入门指南:调用FFmpeg原生API和JavaCV是如何封装了FFmpeg的音视频操作?

JavaCV入门指南系列: JavaCV入门指南:序章(看完本章后,不想看原理的小伙伴可直接跳转到《快速上手篇》) JavaCV入门指南:调用FFmpeg原生API和JavaCV是如何封装了FFmpeg的音视频操作 JavaCV入门指南:调用opencv原生API和JavaCV是如何封装了opencv的图像处理操作 JavaCV入…

javaFX游戏开发实战:从零开始开发和实现自娱自乐小游戏:奥赛罗(黑白棋、翻转棋),支持可落子位置提示,原创翻转算法,基于JavaFX2.0的Canvas画板,界面逻辑与算法分离结构

前言: 这次是从前就特别喜欢玩的“奥赛罗”,但是国内玩的人不多,后来也就慢慢淡忘了。偶然想起来,觉得还是挺有意思的,就着手开发了。之前已经写过两三个小游戏,所以开发起来也很顺畅,原以为利用业余时间几天应该能写完的,断断续续写了两三个星期。中间觉得不好又推翻…

BMP2YUV文件转化

BMP文件数据中的四层结构&#xff0c;分别是位图文件头、位图信息头、调色板、实际的位图数据。从位图信息头中提取图像宽高、实际的位图数据所在数据&#xff0c;从BMP中读取实际的位图数据&#xff0c;进而索引调色板数组得到每一数据的实际物理意义&#xff0c;即查找得到各…