数据压缩实验报告1 彩色空间转换

openCv学习笔记(十一)—位图的读取与存储(c语言实现) typedef unsigned char BYTE; typedef unsigned short WORD; typedef unsigned int DWORD; typedef long LONG; //位图文件头定义; //其中不包含文件类型信息(由于结构体的内存结构决定, //要是加了的话将不能正确读取文件信息) typedef struct tagRGBQUAD{ BYTE rg 阅读详情

实验内容:1.编写RGB转化为YUV程序,重点掌握函数定义,部分查找表的初始化和调用,缓冲区
分配。将得到的RGB文件转换为YUV文件,用YUV Viewer播放器观看,验证是否正确。
2.编写将YUV转换为RGB的程序。将给定的实验数据用该程序转换为RGB文件。并与原
RGB文件进行比较,如果有误差,分析误差来自何处。

YUV与RGB空间的相互转换
由电视原理可知,亮度和色差信号的构成如下:
Y=0.2990R+0.5870G+0.1140B
U=-0.1684R-0.3316G+0.5B
V=0.5R-0.4187G-0.0813B

R=1.000Y+1.4020(V−128)
G=1.000Y−0.3441(U−128)−0.7139(V−128)
B=1.000Y+1.7718(U−128)−0.0013(V−128)
​

在这里插入图片描述需要在项目属性中设置命令参数和工作目录

rgb2yuv.cpp

#include<stdio.h>
#include<stdlib.h>
const int width = 256;
const int height = 256;
int main(int argc,char *argv[])
{
    FILE* rgb=NULL;
    FILE* yuv=NULL;
    //判断是否成功打开文件
    if (fopen_s(&rgb, argv[1], "rb") != 0)
        printf("file not opened\n");
    else
        printf("file opened\n");
    if (fopen_s(&yuv, argv[2], "wb") != 0)
        printf("file not opened\n");
    else
        printf("file opened\n");
    //建立缓冲区
    unsigned char* buffer_rgb = (unsigned char*)malloc(sizeof(unsigned char) * 3 * width * height);
    unsigned char* buffer_y = (unsigned char*)malloc(sizeof(unsigned char) * width * height);
    unsigned char* buffer_u = (unsigned char*)malloc(sizeof(unsigned char) * width * height / 4);
    unsigned char* buffer_v = (unsigned char*)malloc(sizeof(unsigned char) * width * height / 4);
    //读文件
    fread(buffer_rgb, sizeof(unsigned char), 3 * width * height,rgb);
    //计算y分量
    for (int i = 0; i < width * height; i++)
    {
        buffer_y[i] = 0.299 * buffer_rgb[3 * i + 2] + 0.587 * buffer_rgb[3 * i + 1] + 0.114 * buffer_rgb[3 * i];
        if (buffer_y[i] > 235)
            buffer_y[i] = 235;
        else if (buffer_y[i] < 16)
            buffer_y[i] = 16;
    }
    //计算u分量
    int k = 0;
    for (int i = 0; i < height ; i++)
        for (int j = 0; j < width; j++)
        {
            if (i % 2 == 0 && j % 2 == 0)
            {
                buffer_u[k] = -0.1684 * buffer_rgb[3 * (i * width + j) + 2] - 0.3316 * buffer_rgb[3 * (i * width + j) + 1] + 0.5 * buffer_rgb[3 * (i * width + j)]+128;
                if (buffer_u[k] > 240)
                    buffer_u[k] = 240;
                else if (buffer_u[k] < 16)
                    buffer_u[k] = 16;
                k++;
            }
        }
    //计算v分量
    k = 0;
    for (int i = 0; i < height; i++)
        for (int j = 0; j < width; j++)
        {
            if (i % 2 == 0 && j % 2 == 0)
            {
                buffer_v[k] = 0.5 * buffer_rgb[3 * (i * width + j) + 2] - 0.4187 * buffer_rgb[3 * (i * width + j) + 1] - 0.0813 * buffer_rgb[3 * (i * width + j)]+128;
                if (buffer_v[k] > 240)
                    buffer_v[k] = 240;
                else if (buffer_v[k] < 16)
                    buffer_v[k] = 16;
                k++;
            }
        }
    //写入文件
    fwrite(buffer_y, sizeof(unsigned char), width * height, yuv);
    fwrite(buffer_u, sizeof(unsigned char), width * height / 4, yuv);
    fwrite(buffer_v, sizeof(unsigned char), width * height / 4, yuv);
    //释放缓冲区,关闭文件
    if (buffer_rgb != NULL)
        free(buffer_rgb);
    if (buffer_y != NULL)
        free(buffer_y);
    if (buffer_u != NULL)
        free(buffer_u);
    if (buffer_v != NULL)
        free(buffer_v);
    if (rgb != NULL)
        fclose(rgb);
    if (yuv != NULL)
        fclose(yuv);
    return 0;
}

在这里插入图片描述
原rgb图像

在这里插入图片描述
转换后的yuv图像

可见转换后的yuv图像与原rgb图像没有什么区别

yuv2rgb.cpp

#include<stdio.h>
#include<stdlib.h>
const int width = 256;
const int height = 256;
int main(int argc,char *argv[])
{
	FILE* rgb = NULL;
	FILE* yuv = NULL;
	//判断是否成功打开文件
	if (fopen_s(&yuv, argv[1], "rb") != 0)
		printf("file not opened\n");
	else
		printf("file opened\n");
	if (fopen_s(&rgb, argv[2], "wb") != 0)
		printf("file not opened\n");
	else
		printf("file opened\n");
	//建立缓冲区
	unsigned char* buffer_rgb = (unsigned char*)malloc(sizeof(unsigned char) * 3 * width * height);
	unsigned char* buffer_y = (unsigned char*)malloc(sizeof(unsigned char) * width * height);
	unsigned char* buffer_u = (unsigned char*)malloc(sizeof(unsigned char) * width * height / 4);
	unsigned char* buffer_v = (unsigned char*)malloc(sizeof(unsigned char) * width * height / 4);
	//读文件
	fread(buffer_y, sizeof(unsigned char), width * height, yuv);
	fread(buffer_u, sizeof(unsigned char), width * height / 4, yuv);
	fread(buffer_v, sizeof(unsigned char), width * height / 4, yuv);
	//处理y分量数据
	unsigned char y[width][height] = { 0 };
	for (int i = 0; i < height; i++)
		for (int j = 0; j < width; j++)
			y[i][j] = buffer_y[i * width + j];
	//处理u和v分量数据
	unsigned char u[width][height] = { 0 };
	unsigned char v[width][height] = { 0 };
	int k = 0;
	for(int i=0;i<height;i++)
		for (int j = 0; j < width; j++)
		{
			if (i % 2 == 0 && j % 2 == 0)
			{
				u[i][j] = buffer_u[k];
				v[i][j] = buffer_v[k];
				k++;
			}
			else if (i % 2 == 0 && j % 2 == 1)
			{
				u[i][j] = u[i][j - 1];
				v[i][j] = v[i][j - 1];
			}
			else if (i % 2 == 1 && j % 2 == 0)
			{
				u[i][j] = u[i - 1][j];
				v[i][j] = v[i - 1][j];
			}
			else if (i % 2 == 1 && j % 2 == 1)
			{
				u[i][j] = u[i - 1][j - 1];
				v[i][j] = v[i - 1][j - 1];
			}
		}
	//计算rgb分量,注意这里是bgr
	for(int i=0;i<height;i++)
		for (int j = 0; j < width; j++)
		{
			buffer_rgb[3 * (i * width + j)] = y[i][j] + 1.7718 * (u[i][j] - 128) - 0.0013 * (v[i][j] - 128);
			buffer_rgb[3 * (i * width + j) + 1] = y[i][j] - 0.3441 * (u[i][j] - 128) - 0.7139 * (v[i][j] - 128);
			buffer_rgb[3 * (i * width + j) + 2] = y[i][j] + 1.4020 * (v[i][j] - 128);
		}
	//写入文件
	fwrite(buffer_rgb, sizeof(unsigned char), 3 * width * height, rgb);
	//释放缓冲区,关闭文件
	if (buffer_rgb != NULL)
		free(buffer_rgb);
	if (buffer_y != NULL)
		free(buffer_y);
	if (buffer_u != NULL)
		free(buffer_u);
	if (buffer_v != NULL)
		free(buffer_v);
	if (rgb != NULL)
		fclose(rgb);
	if (yuv != NULL)
		fclose(yuv);
	return 0;
}

在这里插入图片描述
原rgb图像

在这里插入图片描述
由yuv图像转换的rgb图像

可见转换来的rgb图像与原来的相比出现了一些红色和蓝色的点。产生误差的原因:由于采用4:2:0的色度格式采样,yuv图像的一些uv数据并不是由原图像的rgb数据得到,所以再转换时会产生误差。

数据压缩实验一实验报告 阅读详情

相关推荐

数据压缩原理实验1_彩色空间转换实验(yuv转rgb)

数据压缩原理实验1_彩色空间转换实验(yuv转rgb) 一、本实验涉及到的基本原理 (1)Rgb转为yuv Y  =   0.299*R + 0.587*G + 0.114*B B-Y =  -0.299*R + 0.413*G - 0.114*B R-Y =   0.701*R - 0.587*G - 0.114*B 为了使色差信号的动态范围控制在-0.5至0.5之间,需要进

cherry_holmes的博客 750

结构体malloc相关问题

struct image { struct buff *buf; unsigned char **data; }; struct image *newimage(int nr,int nc) { struct image *img; img = (struct image *) malloc( sizeof (struct image) ); img->buf = (struct header *)malloc( sizeof(struct buff) .

ldysl111的博客 775

数据压缩实验一:彩色空间转换

1.彩色空间转换的基本思想及转换公式 (1)YUV与RGB空间的相互转换 由电视原理可知,亮度和色差信号的构成如下: Y=0.2990R+0.5870G+0.1140B R-Y=0.7010R-0.5870G-0.1140B B-Y=-0.2990R-0.5870G+0.8860B 为了使色差信号的动态范围控制在0.5之间,需要进行归一化,对色差信号引入压缩系数。归一化后的色差信号为: U=-0....

m0_46338411的博客 352

TIF图像文件的读取(c++代码)

一 TIF图像介绍     TIFF是最复杂的一种位图文件格式。TIFF是基于标记的文件格式,它广泛地应用于对图像质量要求较高的图像的存储与转换。由于它的结构灵活和包容性大,它已成为图像文件格式的一种标准,绝大多数图像系统都支持这种格式。    TIFF 是一个灵活适应性强的文件格式,通过在文件头中包含“标签”它能够在一个文件中处理多幅图像和数据。标签能够标明图像的如图像大小这样的基本几何尺寸

数学屌丝走在it的道路上 2万+

【数据压缩作业】使用C++实现YUV与RGB彩色空间转换

目录一、实验要求二、RGB TO YUV1. 实验原理2. 代码实现3. 实验结果三、YUV TO RGB1. 实验原理2. 代码实现(1)主函数(2)子程序(3)定义指针(4)开缓冲3.实验结果四、实验总结 一、实验要求 1.学会从计算和程序的角度分析问题 通过完成本实验,理解计算思维,即从问题出发,通过逐步分析和分解,把原问题转化 为可用程序方式解决的问题。在此过程中设计出一个解决方案。 2.进一步理解彩色空间的概念并掌握不同彩色空间转换的基本方程。 3.通过逐步设计程序,掌握编程细节:如查找表的设计,

Abigailiar的博客 696

数据压缩实验一——彩色空间转换

1.学会从计算和程序的角度分析问题 通过完成本实验,理解计算思维,即从问题出发,通过逐步分析和分解,把原问题转化 为可用程序方式解决的问题。在此过程中设计出一个解决方案。 2.进一步理解彩色空间的概念并掌握不同彩色空间转换的基本方程。 3.通过逐步运行程序,掌握编程细节:如查找表的设计,内存分配,对 U 和 V 信号进 行下采样,文件读写过程等。掌握程序调试的基本方法。

willshant的博客 766

图像算法之局部直方图均衡化(灰度图像)

1、函数定义 //局部直方图均衡化 ksize - 领域大小,kstep - 领域中心步长 struct stPGMImage* LocalEqualHist(struct stPGMImage* image, int ksize = 3, int kstep = 1); 2、函数实现 #include <math.h> #include <vector> using namespace std; struct stPGMImage* LocalEqualHist(stru

老狼的专栏 2031

数据压缩实验之彩色空间转换

为了实现RGB到YUV转换,我们要了解这两种格式的特点和关系。 存储方式: RGB的存储方式:RGB三个分量按照B、G、R的顺序储存。(4:4:4) YUV的存储方式:先存Y再存UV分量。(4:2:0) 转换公式: Y = 0.298R + 0.612G + 0.117B; U = -0.1684R - 0.3316G + 0.5B + 128; V = 0.5R - 0.4187G - 0.0813B + 128; PS:计算UV分量时+128是因为UV分量有负值,加上128可以将变化范围调整.

weixin_46393626的博客 245

彩色图像处理 & 彩色空间转换及代码实现

为什么要研究彩色图像处理? 符合人类视觉特点:人类可以辨别几千种颜色色调和亮度;只能辨别几十种灰度层次。 有用的描绘子:简化目标物的区分;目标识别,根据目标的颜色特征。 彩色图像处理可分为: 全彩色处理:数码相机,数码摄像机,彩色扫描仪。 伪彩色处理:对不同的灰度或灰度范围赋予不同的颜色。 当一束白光通过一个玻璃棱镜时,出现的光束 不是白光,而是由一端为紫色到另一端为红色的 连续彩色谱组成。

m0_61899108的博客 1576

数据压缩实验一——YUV和RGB互相转换

数据压缩——YUV和RGB互相转换 一、实验内容: 1,实现将编写将YUV转换为RGB的程序。将给定的实验数据用该程序转换 为RGB文件。并与原RGB文件进行比较,如果有误差,分析误差来自何处。2,总结 RGB 和 YUV 彩色空间转换的转换公式及编程实现的算法并写成实验报告。 二、实验原理: Y=0.299R+0.587G+0.114B U=-0.1684R-0.3316G+0.5B+128 V=0.5R-0.4187G-0.0813B+128 R=Y+1.4075(V-128) G=Y-0.3455(U

weixin_50971817的博客 833

从理论到实践:利用FilterSolutions高效设计7阶椭圆低通滤波器

本文详细介绍了如何利用FilterSolutions软件高效设计7阶椭圆低通滤波器。文章从理论入手,对比了巴特沃斯、切比雪夫等经典滤波器特性,阐述了在要求高衰减陡度(如62dB抑制)和严格通带波纹(0.2dB)时,椭圆滤波器是最优选择。通过分步实战教程,指导读者完成从软件参数设置、性能验证到实际电路布局与调试的全过程,助力射频与高速数字信号处理工程师将理论转化为可靠设计。

jupi8的博客 559

数据压缩原理与应用之彩色空间转换 实验报告1

1、实验基本原理 (1)YUV 与 RGB 空间的相互转换 Y=0.2990R+0.5870G+0.1140B R-Y=0.7010R -0.5870G -0.1140B B-Y=-0.2990R -0.5870G+0.8860B 归一 化后的色差信号为: U=-0.1684R -0.3316G+0.5B V=0.5R -0.4187G -0.0813B 为将两个色差

m0_37644417的博客 313

技术指南| 叶绿体基因组高级分析全流程解析

本文详细解析了叶绿体基因组高级分析的全流程,包括实验设计、序列组装与注释、比较基因组分析、选择压力与功能进化等关键步骤。通过实战案例和技术技巧,帮助研究者掌握叶绿体基因组分析的核心方法,提升植物进化研究和系统学分析的效率与准确性。

weixin_33725239的博客 491

【数据压缩实验1】彩色空间转换

实验

weixin_46735999的博客 191

从ADS到Origin:高效绘制负载牵引Smith圆图的完整指南

本文提供了一份从ADS导出负载牵引数据并在Origin中绘制专业Smith圆图的完整指南。详细介绍了数据导出、导入、关键的数据解释步骤,以及高效处理多组曲线的技巧,帮助射频工程师快速生成用于报告和论文的出版级图表。

tgb3456789的博客 1137

USB之ch376s数据手册

         最近师兄交给我一个项目,虽说刚学嵌入式起步,但上手一个项目怎说都是最好的快速学习方式。因为刚了解ch376s管理U盘的数据,所以先是看了ch376s的数据手册。那我就把数据手册直接放上来吧。。。。      1、概述 CH376 是文件管理控制芯片,用于单片机系统读写 U 盘或者 SD 卡中的文件。 CH376 支持 USB 设备方式和 USB 主机方式,并且内置了 USB 通...

iBGG的博客 6004

数据压缩实验1|彩色空间转换

数据压缩2|彩色空间转换实验目的实验内容实验步骤 实验目的 1.学会从计算和程序的角度分析问题 通过完成本实验,理解计算思维,即从问题出发,通过逐步分析和分解,把原问题转化为可用程序方式解决的问题。在此过程中设计出一个解决方案。 2.进一步理解彩色空间的概念并掌握不同彩色空间转换的基本方程。 3.通过逐步设计程序,掌握编程细节:如查找表的设计,内存分配,对 U 和 V 信号进行下采样,文件读写过程等。掌握程序调试的基本方法。 实验内容 1.掌握彩色空间转换的基本思想及转换公式 (1)YUV与RGB空间的相互

mengjiuye的博客 217

数字取证双雄:Passware Kit Forensic 与 ElcomSoft 在实战场景下的能力边界解析

本文深入解析了Passware Kit Forensic与ElcomSoft在数字取证实战中的能力边界,涵盖Windows、macOS、iOS和Android系统的密码恢复与数据提取技术。通过真实案例对比两款工具在硬件加速、分布式计算及云取证等场景下的表现差异,为取证专家提供关键决策参考。特别探讨了密码恢复软件在加密设备突破中的核心作用。

weixin_30342209的博客 399

数据压缩 彩色空间转换

数据压缩实验一 彩色空间转换实验原理 YUV到RGB空间的转换公式 由电视原理知识可知,数字视频系统中对色差信号的压缩公式为: Cr=0.713(R−Y)Cr=0.713(R-Y) Cb=0.564(B−Y)Cb=0.564(B-Y) 此时色差信号经过归一化处理,动态范围为-0.5-0.5,让色差零电平对应码电平128(8比特量化时),则有: V=0.713(R−Y)+128V=0.713

Sssssusu的博客 874

MMI分束器仿真优化:用Lumerical FDTD实现95%耦合效率的实战技巧

本文详细介绍了使用Lumerical FDTD软件对MMI分束器进行仿真优化的实战技巧。通过构建高保真模型、精确配置光源与边界条件,并重点优化波导结构与taper设计,系统性地将器件的耦合效率提升至95%以上。文章还分享了利用参数扫描、varFDTD加速等高级方法,帮助硅光芯片设计工程师高效实现高性能MMI分束器设计。

rainy的博客 772

【100%通过率】2023华为od机试C卷【电脑病毒感染】C++ 实现

一个局域网内有很多台电脑,分别标注为 0 ~ N-1 的数字。相连接的电脑距离不一样,所以感染时间不一样,感染时间用t 表示。其中网络内一台电脑被病毒感染,求其感染网络内所有的电脑最少需要多长时间。如果最后有电脑不会感染,则返回-1.

MISAYAONE的博客 1727

数据压缩实验一|彩色空间转换

“数据压缩原理与应用”实验 一、实验课程编码:103050 二、实验课程名称:数据压缩原理与应用 A 三、实验项目名称:彩色空间转换 四、实验目的 1.学会从计算和程序的角度分析问题 通过完成本实验,理解计算思维,即从问题出发,通过逐步分析和分解,把原问题转化 为可用程序方式解决的问题。在此过程中设计出一个解决方案。 2.进一步理解彩色空间的概念并掌握不同彩色空间转换的基本方程。 3.通过逐步设计程序,掌握编程细节:如查找表的设计,内存分配,对 U 和 V 信号进 行下采样,文件读写过程等。掌握程序调试的基

m0_55764256的博客 273

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

数据压缩原理实验1_实验报告

数据压缩原理实验1_彩色空间转换实验(yuv转rgb)一、实验原理 (1)RGB转YUV Y=0.2990R+0.5870G+0.1140B R-Y=0.7010R-0.5870G-0.1140B B-Y=-0.2990R-0.5870G+0.8860B 为了使色差信号的动态范围控制在0.5之间,需要进行归一化,对色差信号引入压缩系数。归一化后的色差信号为: U=-0.1684R-0.33

jiaoshiyuan的博客 923

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

数据压缩 | 实验一_彩色空间转换

分析.rgb和.yuv文件三个通道的概率分布,并计算各自的熵(编程实现)

xxxx4moon_的博客 268

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

数据压缩原理与应用 彩色空间转换RGB2YUV

1.实验内容 YUV文件格式分为三个分量,“Y”表示明亮度,也就是灰度值,而“U”和“V” 表示的则是色度,作用是描述影像色彩及饱和度,用于指定像素的颜色。 本实验中YUV文件采用取样格式是4:2:0,即为U、V两个色差信号地取样频率是Y亮度信号的1/4,水平和垂直方向的取样点数均为Y的1/2。 而RGB取样格式为4:4:4,所以将YUV文件转换成RGB,要将U和V进行变化,即取样点数和Y一

lanee_lee的博客 714
上一篇: 数据压缩第三次作业
下一篇: 数据压缩作业 图像文件分析
タン
博客等级 码龄8年 15粉丝 14原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值