数字图像处理(11):RGB转YUV

(1)RGB颜色空间

        RGB颜色空间,是一种基于红色、绿色、蓝色三种基本颜色进行混合的颜色空间,通过这三种颜色的叠加,可以产生丰富而广泛的颜色。RGB颜色空间在计算机图像处理、显示器显示、摄影和影视制作等领域具有广泛应用。R、G、B取值通常8bit表示,因此代表三基色的红、绿、蓝通道分别用0~255的整数表示强度,0亮度最低;255亮度最高。(0,0,0)表示黑色,(255,255,255)表示白色。

(2)YUV颜色空间

        YUV颜色空间,又常称为YCbCr颜色空间,是用于数字电视的颜色空间,Y表示亮度、U表示蓝色色差(蓝色与绿色的差异),V表示红色色差(红色与蓝白色的差异)。

(3)RGB与YUV的转换公式

(4)matlab实现

% 1. 读取图像
rgb_image = imread('3_1280x720.bmp');  % 或其他图像名称% 获取屏幕分辨率
screen_size = get(0, 'ScreenSize');
screen_width = screen_size(3);
screen_height = screen_size(4);% 计算合适的显示尺寸
max_single_width = (screen_width - 200) / 3;
scale = max_single_width / size(rgb_image, 2);
display_width = round(size(rgb_image, 2) * scale);
display_height = round(size(rgb_image, 1) * scale);% 2. 将RGB图像转换为YUV图像
yuv_image = zeros(size(rgb_image));
R = double(rgb_image(:,:,1));
G = double(rgb_image(:,:,2));
B = double(rgb_image(:,:,3));% RGB to YUV转换
Y = 0.299*R + 0.587*G + 0.114*B;
U = 0.5*B - 0.169*R - 0.331*G + 128;  
V = 0.5*R - 0.419*G - 0.081*B + 128; yuv_image(:,:,1) = Y;
yuv_image(:,:,2) = U;
yuv_image(:,:,3) = V;% 3. 将YUV图像转换回RGB图像
Y = double(yuv_image(:,:,1));
U = double(yuv_image(:,:,2));
V = double(yuv_image(:,:,3));% YUV to RGB转换
R2 = Y + 1.402*(V-128);
G2 = Y - 0.344*(U-128) - 0.714*(V-128);
B2 = Y + 1.772*(U-128);% 确保RGB值在正确范围内
rgb_image_again = zeros(size(rgb_image), 'uint8');
rgb_image_again(:,:,1) = uint8(min(max(R2, 0), 255));
rgb_image_again(:,:,2) = uint8(min(max(G2, 0), 255));
rgb_image_again(:,:,3) = uint8(min(max(B2, 0), 255));% 4. 显示图像
% 计算窗口位置
window_spacing = 50;
x_pos1 = round((screen_width - 3*display_width - 2*window_spacing)/2);
x_pos2 = x_pos1 + display_width + window_spacing;
x_pos3 = x_pos2 + display_width + window_spacing;
y_pos = round((screen_height - display_height)/2);% 显示原始RGB图像
figure('Name', 'RGB Image', 'NumberTitle', 'off');
imshow(imresize(rgb_image, [display_height display_width]));
set(gcf, 'Position', [x_pos1 y_pos display_width display_height]);% 显示YUV图像
figure('Name', 'YUV Image', 'NumberTitle', 'off');
imshow(uint8(imresize(yuv_image, [display_height display_width])));
set(gcf, 'Position', [x_pos2 y_pos display_width display_height]);% 显示转换回的RGB图像
figure('Name', 'Converted RGB Image', 'NumberTitle', 'off');
imshow(imresize(rgb_image_again, [display_height display_width]));
set(gcf, 'Position', [x_pos3 y_pos display_width display_height]);

(5)FPGA         RGB转YUV代码:

module RGB_YUV
(input   wire    [7:0]   red     ,input   wire    [7:0]   green   ,input   wire    [7:0]   blue    ,output  wire    [7:0]   Y       ,output  wire    [7:0]   U       ,output  wire    [7:0]   V       );wire    [17:0] Y_w,U_w,V_w;parameter Y_1 = 18'd306;            //0.299*1024
parameter Y_2 = 18'd601;            //0.587*1024
parameter Y_3 = 18'd117;            //0.114*1024parameter U_1 = 18'd512;            //0.5*1024
parameter U_2 = 18'd173;            //0.169*1024
parameter U_3 = 18'd339;            //0.331*1024
parameter U_4 = 18'd131072;         //128*1024parameter V_1 = 18'd512;            //0.5*1024
parameter V_2 = 18'd429;            //0.419*1024
parameter V_3 = 18'd83;             //0.081*1024
parameter V_4 = 18'd131072;         //128*1024assign Y_w = Y_1 * red + Y_2 * green + Y_3 * blue;
assign U_w = U_1 * blue  - U_2 * red - U_3 * green + U_4;
assign V_w = V_1 * red  - U_2 * green - U_3 * blue + U_4;assign Y = Y_w[17:10];
assign U = U_w[17:10];
assign V = V_w[17:10];endmodule

(6)仿真及实验现象

使用先前的读写BMP图片的仿真测试工程,添加RGB_YUV模块,观察仿真出来的波形。

module img_process
(input   wire            clk         ,input   wire            reset_n     ,input   wire    [10:0]  img_width   ,input   wire    [10:0]  img_height  ,input   wire            valid_i     ,input   wire    [23:0]  img_data_i  ,output  reg             valid_o     ,output  reg     [23:0]  img_data_o  );wire    [7:0]   Y_data              ;
wire    [7:0]   U_data              ;
wire    [7:0]   V_data              ;
wire    [23:0]  yuv_data            ;RGB_YUV     rgb_yuv_inst
(.red        (img_data_i[23:16]),.green      (img_data_i[15:8]),.blue       (img_data_i[7:0]),.Y          (Y_data),.U          (U_data),.V          (V_data)
); assign yuv_data = {Y_data,U_data,V_data}; always@(posedge clk or negedge reset_n)if(!reset_n)beginvalid_o <= 1'd0;img_data_o <= 24'd0;endelse beginvalid_o <= valid_i;img_data_o <= yuv_data;endendmodule

 上板验证后的波形:与matlab处理和仿真出来的差不多

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/485820.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

nodejs33: react中的IndexedDB 原有API+操作库idb+数据库事务

在 React 中使用 IndexedDB 作为本地数据库存储可以有效地管理大量的数据&#xff0c;比如缓存、离线功能或状态持久化。可以通过索引进行快速查询&#xff0c;支持事务处理&#xff0c;并且异步操作。 特点&#xff1a; 存储键值对。 支持事务。 数据可以分层组织为数据库、…

创造未来:The Sandbox 创作者训练营如何赋能全球创造者

创作者训练营让创造者有能力打造下一代数字体验。通过促进合作和提供尖端工具&#xff0c;The Sandbox 计划确保今天的元宇宙是由一个个创造者共同打造。 2024 年 5 月&#xff0c;The Sandbox 推出了「创作者训练营」系列&#xff0c;旨在重新定义数字创作。「创作者训练营」系…

Linux---对缓冲区的简单理解--第一个系统程序

前序&#xff1a; 首先先理解一下什么是回车与换行&#xff1b;回车和换行是两个概念&#xff0c;它们不是一个东西&#xff1b; 回车:光标回到开始&#xff1b;换行:换到下一行&#xff1b; 如下图&#xff1a; 行缓冲区 如何理解缓冲区问题&#xff1f; 可以认为&#xff0…

线程和进程(juc)

线程 一&#xff1a;概念辨析 1&#xff1a;线程与进程 进程&#xff1a; 1&#xff1a;程序由指令和数据组成&#xff0c;指令要执行&#xff0c;数据要读写&#xff0c;就需要将指令加载给cpu&#xff0c;把数据加载到内存&#xff0c;同时程序运行时还会使用磁盘&#x…

[计算机网络] HTTP/HTTPS

一. HTTP/HTTPS简介 1.1 HTTP HTTP&#xff08;超文本传输协议&#xff0c;Hypertext Transfer Protocol&#xff09;是一种用于从网络传输超文本到本地浏览器的传输协议。它定义了客户端与服务器之间请求和响应的格式。HTTP 工作在 TCP/IP 模型之上&#xff0c;通常使用端口 …

selenium常见接口函数使用

博客主页&#xff1a;花果山~程序猿-CSDN博客 文章分栏&#xff1a;测试_花果山~程序猿的博客-CSDN博客 关注我一起学习&#xff0c;一起进步&#xff0c;一起探索编程的无限可能吧&#xff01;让我们一起努力&#xff0c;一起成长&#xff01; 目录 1. 查找 查找方式 css_s…

新址启新程 宜宾考拉悠然入驻宜宾市大数据产业园

12月4日&#xff0c;宜宾考拉悠然科技有限公司入驻宜宾市大数据产业园&#xff0c;此次喜迁新址&#xff0c;标志其在宜宾业务步入崭新阶段。 2020年&#xff0c;考拉悠然联合四川省人工智能研究院&#xff0c;结合宜宾人工智能科研、产业发展需要&#xff0c;共同孵化了宜宾考…

使用Redis Stream偶发空指针问题

问题描述&#xff1a;使用redission客户端封装的stream消息队列&#xff0c;在进行消息轮询时&#xff0c;偶发出现空指针问题。 [2024-11-13 09:59:20] [] [] [redis-stream-consumer-thread-1 ] [lambda$streamMessageListenerContainer$1] [ERROR] [c.r.c.r.s.config.Redi…

2024年11月HarmonyOS应用开发者高级认证 最新题库

新增单选 1.下述代码片段中的renderGroup属性&#xff0c;对性能的影响是什么&#xff1a;A A.劣化 B.不一定 C.没有变化 D.优化 2.在刷新Image组件内容时&#xff0c;如果观察到画面会闪一下白块&#xff0c;要怎样优化才能避免白块儿出现&#xff0c;同时又不会卡住画面…

大语言模型应用Text2SQL本地部署实践初探

自从两年前OpenAI公司发布ChatGPT后&#xff0c;大模型(Large Language Model&#xff0c;简称LLM)相关技术在国内外可谓百家争鸣&#xff0c;遍地开花&#xff0c;在传统数据挖掘、机器学习和深度学习的基础上&#xff0c;正式宣告进入快速发展的人工智能(Artificial Intellig…

Leetcode—1539. 第 k 个缺失的正整数【简单】

2024每日刷题&#xff08;206&#xff09; Leetcode—1539. 第 k 个缺失的正整数 C实现代码 class Solution { public:int findKthPositive(vector<int>& arr, int k) {int missing 1;int cur 1;int n arr.size();int missingCnt 0;int ptr 0;for(; missingCn…

PSAI海报设计新选择!StartAI Flux文生图一键生成创意海报!

设计师们&#xff0c;是时候展现你们的创意魔力了&#xff01;StartAI的Flux文生图功能&#xff0c;这款专为设计领域打造的创意工具&#xff0c;正等待着为你的圣诞节海报带来无限灵感与活力&#xff01; 想象一下&#xff0c;你的圣诞节海报不再局限于传统的元素和布局&…

Django模板系统

1.常用语法 Django模板中只需要记两种特殊符号&#xff1a; {{ }}和 {% %} {{ }}表示变量&#xff0c;在模板渲染的时候替换成值&#xff0c;{% %}表示逻辑相关的操作。 2.变量 {{ 变量名 }} 变量名由字母数字和下划线组成。 点&#xff08;.&#xff09;在模板语言中有…

使用Java将PDF文件解析成Excel文件

安装pom依赖 <!-- 解析pdf--><dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox</artifactId><version>2.0.27</version> <!-- 请检查并使用最新版本 --></dependency>测试读取pdf文件…

K8S,StatefulSet

有状态应用 Deployment实际上并不足以覆盖所有的应用编排问题&#xff1f; 分布式应用&#xff0c;它的多个实例之间&#xff0c;往往有依赖关系&#xff0c;比如&#xff1a;主从关系、主备关系。 还有就是数据存储类应用&#xff0c;它的多个实例&#xff0c;往往都会在本地…

如何使用Java编写Jmeter函数

Jmeter 自带有各种功能丰富的函数&#xff0c;可以帮助我们进行测试&#xff0c;但有时候提供的这些函数并不能满足我们的要求&#xff0c;这时候就需要我们自己来编写一个自定义的函数了。例如我们在测试时&#xff0c;有时候需要填入当前的时间&#xff0c;虽然我们可以使用p…

单例模式的析构学习

1、例子 如果单例对象是类的static成员&#xff0c;那么在程序结束时不会调用类的析构函数&#xff0c;如下&#xff1a; #include <iostream> using namespace std;class A{ private:static A* m_ins;//声明&#xff0c;静态指针成员A(){} public:static A* getIns(){…

Python 在同一/或不同PPT文档之间复制幻灯片

复制幻灯片可以帮助我们更高效地完成工作&#xff0c;节省大量的制作时间。通过复制现有的幻灯片&#xff0c;可以快速创建新的演示文稿&#xff0c;而无需重新设计板式样式等。此外&#xff0c;复制幻灯片还可以帮助我们保持内容的一致性&#xff0c;使整个PPT演示文稿看起来更…

Fastadmin的定时任务详解

文章目录 Fastadmin的定时任务详解一、引言二、实现定时任务1、创建定时任务控制器2、配置定时任务 三、使用示例1. 编写备份脚本2. 配置定时任务3. 测试定时任务4. 监控备份结果 四、总结 Fastadmin的定时任务详解 一、引言 FastAdmin是一款基于ThinkPHP框架开发的后台管理系…

Python酷库之旅-第三方库Pandas(262)

目录 一、用法精讲 1241、pandas.tseries.offsets.WeekOfMonth.n属性 1241-1、语法 1241-2、参数 1241-3、功能 1241-4、返回值 1241-5、说明 1241-6、用法 1241-6-1、数据准备 1241-6-2、代码示例 1241-6-3、结果输出 1242、pandas.tseries.offsets.WeekOfMonth.w…