数字图像处理(23):YUV444与YUV422

news2024/12/15 5:05:09

        (1)在YUV颜色空间中,“Y”表示灰度,可以体现人眼对亮度的敏感程度,如果没有U和V信息,只有Y信息,图像仍然可以显示出来,只不过是灰色的;“U”和“V”表示色度,作用是描述影像色彩和饱和度,用于指定像素的颜色。“U”和“V”一起描述了色彩的饱和度以及色调。

        (2)因为人眼对亮度比色度更敏感,因此色度通道(“U”和“V”)采样率可以低于亮度通道,而不会显著降低感知质量。主流的采用方式有三种:YUV444,YUV422,YUV420。

        YUV444:

  • 每个Y分量都对应一组UV分量
  • 采样比例为4:4:4
  • 1个像素点完整保留一组YUV值
  • 无色度信息损失
  • 数据量最大
  • 质量最好

        YUV422:

  • 两个Y分量共用一组UV分量
  • 采样比例为4:2:2
  • 在水平方向上2个像素点共用一组UV值
  • 轻微的色度信息损失
  • 数据量是YUV444的2/3
  • 中等质量

        YUV420:

  • 四个Y分量共用一组UV分量
  • 采样比例为4:2:0
  • 在水平和垂直方向上4个像素点共用一组UV值
  • 色度信息损失较大
  • 数据量是YUV444的1/2
  • 质量较低但仍可接受

        实际应用:

  • YUV444:专业视频制作、高端影像处理
  • YUV422:专业摄像机、高质量视频
  • YUV420:视频压缩、消费级视频设备、网络视频

        (3)matlab实现

% 1. 读取图像
rgb_image = imread('1_1920x1080.bmp');  % 或其他图像名称

% 获取屏幕分辨率
screen_size = get(0, 'ScreenSize');
screen_width = screen_size(3);
screen_height = screen_size(4);

% 计算合适的显示尺寸
max_single_width = (screen_width - 200) / 4;  
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图像转换为YUV444图像
yuv444_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; 

yuv444_image(:,:,1) = Y;
yuv444_image(:,:,2) = U;
yuv444_image(:,:,3) = V;

% 3. 创建YUV422格式图像
% YUV422格式:水平方向上每两个Y共用一组UV
[height, width, ~] = size(rgb_image);
yuv422_image = zeros(height, width, 3);
yuv422_image(:,:,1) = Y;  % Y分量保持不变

% 对U和V进行水平方向2:1降采样
for i = 1:height
    for j = 1:2:width
        if j+1 <= width
            % 每两个像素取平均值
            yuv422_image(i,j:j+1,2) = mean(U(i,j:j+1));  % U分量
            yuv422_image(i,j:j+1,3) = mean(V(i,j:j+1));  % V分量
        else
            % 处理最后一个像素(如果宽度为奇数)
            yuv422_image(i,j,2) = U(i,j);
            yuv422_image(i,j,3) = V(i,j);
        end
    end
end

% 4. 将YUV422图像转换回RGB
Y = yuv422_image(:,:,1);
U = yuv422_image(:,:,2);
V = yuv422_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_422 = zeros(size(rgb_image), 'uint8');
rgb_image_422(:,:,1) = uint8(min(max(R2, 0), 255));
rgb_image_422(:,:,2) = uint8(min(max(G2, 0), 255));
rgb_image_422(:,:,3) = uint8(min(max(B2, 0), 255));

% 5. 显示图像
% 计算窗口位置
window_spacing = 50;
x_pos1 = round((screen_width - 4*display_width - 3*window_spacing)/2);
x_pos2 = x_pos1 + display_width + window_spacing;
x_pos3 = x_pos2 + display_width + window_spacing;
x_pos4 = x_pos3 + display_width + window_spacing;
y_pos = round((screen_height - display_height)/2);

% 显示原始RGB图像
figure('Name', 'Original RGB', 'NumberTitle', 'off');
imshow(imresize(rgb_image, [display_height display_width]));
set(gcf, 'Position', [x_pos1 y_pos display_width display_height]);

% 显示YUV444图像
figure('Name', 'YUV444', 'NumberTitle', 'off');
imshow(uint8(imresize(yuv444_image, [display_height display_width])));
set(gcf, 'Position', [x_pos2 y_pos display_width display_height]);

% 显示YUV422图像
figure('Name', 'YUV422', 'NumberTitle', 'off');
imshow(uint8(imresize(yuv422_image, [display_height display_width])));
set(gcf, 'Position', [x_pos3 y_pos display_width display_height]);

% 显示YUV422转换回的RGB图像
figure('Name', 'RGB from YUV422', 'NumberTitle', 'off');
imshow(imresize(rgb_image_422, [display_height display_width]));
set(gcf, 'Position', [x_pos4 y_pos display_width display_height]);

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HQChart使用教程30-K线图如何对接第3方数据42-DRAWTEXTREL,DRAWTEXTABS数据结构

HQChart使用教程30-K线图如何对接第3方数据42-DRAWTEXTREL,DRAWTEXTABS数据结构 效果图DRAWTEXTREL示例数据结构说明nametypecolorDrawVAlignDrawAlignDrawDrawTypeDrawDataFont DRAWTEXTABS示例数据结构说明nametypecolorDrawVAlignDrawAlignDrawDrawTypeDrawDataFont 效果图 …

elasticsearch 使用Painless脚本

文章目录 1. 创建索引2. 插入模拟数据Painless 脚本的基本特点&#xff1a;Painless 脚本的常见用途1. 脚本查询和过滤示例&#xff1a;基于脚本的查询 2. 脚本字段示例&#xff1a;脚本字段 3. 聚合中的脚本示例&#xff1a;脚本聚合 4. 文档更新中的脚本示例&#xff1a;文档…

PHP搭建环境

一、安装apache 1、获取Apache安装软件 2、双击安装即可:指定对应的路径:E:server/apache 3、选择安装模式:使用自定义模式 4、选择安装位置 二、Apache的目录结构说明 三、Httpd.exe的详细应用 1、服务器进程:运行之后才能够工作

spring cloud contract http实例

微服务很多时&#xff0c;服务之前相互调用&#xff0c;接口参数的一致性要变得很难维护。 spring cloud contract 提供了测试接口一致性的方法。 一 项目配置 plugins {id "groovy"id "org.springframework.cloud.contract" version "4.0.5"i…

【GIS教程】使用GDAL-Python将tif转为COG并在ArcGIS Js前端加载-附完整代码

目录 一、数据格式 二、COG特点 三、使用GDAL生成COG格式的数据 四、使用ArcGIS Maps SDK for JavaScript加载COG格式数据 一、数据格式 COG&#xff08;Cloud optimized GeoTIFF&#xff09;是一种GeoTiff格式的数据。托管在 HTTP 文件服务器上&#xff0c;可以代替geose…

python数据分析之爬虫基础:解析

目录 1、xpath 1.1、xpath的安装以及lxml的安装 1.2、xpath的基本使用 1.3、xpath基本语法 2、JsonPath 2.1、jsonpath的安装 2.2、jsonpath的使用 2.3、jsonpath的基础语法 3、BeautifulSoup 3.1、bs4安装及创建 3.2、beautifulsoup的使用 3.3、beautifulsoup基本语…

【Python网络爬虫笔记】10- os库存储爬取数据

os库的作用 操作系统交互&#xff1a;os库提供了一种使用Python与操作系统进行交互的方式。使用os库来创建用于存储爬取数据的文件夹&#xff0c;或者获取当前工作目录的路径&#xff0c;以便将爬取的数据存储在合适的位置。环境变量操作&#xff1a;可以读取和设置环境变量。在…

TCP 为什么是 3 次握手 4 次挥手?

前言&#xff1a; TCP 的 3 次握手 4 次挥手是一个非常经典的问题&#xff0c;相信各位从事 Java 的朋友在职业生涯中没少被问到这个问题&#xff0c;本篇我们就展开分析一下 TCP 为什么是 3 次握手 4 次挥手。 TCP 协议 要搞清楚 TCP 为什么是 3 次握手 4 次挥手我们需要先…

智能客户服务:科技赋能下的新体验

在当今这个数字化时代&#xff0c;客户服务已经不仅仅是简单的售后服务&#xff0c;它已竞争的关键要素之一。随着人工智能、大数据、云计算等技术的飞速发展&#xff0c;智能客户服务正逐步改变着传统的服务模式&#xff0c;为企业和消费者带来了前所未有的新体验。 一、智能客…

C++ 内存管理和模板与STL

此篇目是之后各种C库的基础 目录 内存管理 内存分布 内存管理方式 new和delete operator new 与 operator delete函数 实现原理 定位new表达式(placement-new) 模板基础 泛型编程 模板 函数模板 类模板 STL 组成部分 内存管理 内存分布 int globalVar 1; //全局变量 静…

深入理解 CSS 文本换行: overflow-wrap 和 word-break

前言 正常情况下&#xff0c;在固定宽度的盒子中的中文会自动换行。但是&#xff0c;当遇到非常长的英文单词或者很长的 URL 时&#xff0c;文本可能就不会自动换行&#xff0c;而会溢出所在容器。幸运的是&#xff0c;CSS 为我们提供了一些和文本换行相关的属性&#xff1b;今…

Polars数据聚合与旋转实战教程

在这篇博文中&#xff0c;我们的目标是解决数据爱好者提出的一个常见问题&#xff1a;如何有效地从Polars DataFrame中创建汇总视图&#xff0c;以便在不同时间段或类别之间轻松进行比较。我们将使用一个实际的数据集示例来探索实现这一目标的各种方法。 Polars简介 Polars 是…

STM32CUBEMX+STM32F4+IAP串口升级应用,亲测可用,带详解

一、IAP的基本概念 IAP,全名为in applacation programming,即在应用编程。 也就是在应用程序中升级。好处就太多了&#xff0c;比如远程在线升级&#xff0c;不用人到现场拆开&#xff0c;用烧写器连接升级。 实现IAP技术的核心是一段预先烧写在单片机内部的IAP程序。这段程…

CTFHub 命令注入-综合练习(学习记录)

综合过滤练习 命令分隔符的绕过姿势 ; %0a %0d & 那我们使用%0a试试&#xff0c;发现ls命令被成功执行 /?ip127.0.0.1%0als 发现一个名为flag_is_here的文件夹和index.php的文件&#xff0c;那么我们还是使用cd命令进入到文件夹下 http://challenge-438c1c1fb670566b.sa…

深入探索 JVM:原理、机制与实战

一、JVM 概述 JVM&#xff08;Java Virtual Machine&#xff09;是 Java 程序运行的核心组件&#xff0c;它提供了一个独立于硬件和操作系统的执行环境&#xff0c;使得 Java 程序能够在不同平台上具有跨平台的特性。 JVM 主要由以下几部分组成&#xff1a; 类装载器&#xf…

视频推拉流EasyDSS无人机直播技术巡查焚烧、烟火情况

焚烧作为一种常见的废弃物处理方式&#xff0c;往往会对环境造成严重污染。因此&#xff0c;减少焚烧、推广绿色能源和循环经济成为重要措施。通过加强森林防灭火队伍能力建设与长效机制建立&#xff0c;各地努力减少因焚烧引发的森林火灾&#xff0c;保护生态环境。 巡察烟火…

挺详细的记录electron【V 33.2.0】打包vue3项目为可执行程序

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言 一、直接看效果 二、具体步骤 1.安装配置electron 1.将 electron 包安装到应用的开发依赖中。 2.安装electron-packager依赖&#xff08;打包可执行文件&#…

基本分页存储管理

一、实验目的 目的&#xff1a;熟悉并掌握基本分页存储管理的思想及其实现方法&#xff0c;熟悉并掌握基本分页存储管理的分配和回收方式。 任务&#xff1a;模拟实现基本分页存储管理方式下内存空间的分配和回收。 二、实验内容 1、实验内容 内存空间的初始化——可以由用户输…

Vue Web开发(五)

1. axios axios官方文档 异步库axios和mockjs模拟后端数据&#xff0c;axios是一个基于promise的HTTP库&#xff0c;使用npm i axios。在main.js中引入&#xff0c;需要绑定在Vue的prototype属性上&#xff0c;并重命名。   &#xff08;1&#xff09;main.js文件引用 imp…

论文概览 |《IJAEOG》2024.08 Vol.132(下)

本次给大家整理的是《International Journal of Applied Earth Observation and Geoinformation》杂志2024年08月第132期的论文的题目和摘要&#xff0c;一共包括88篇SCI论文&#xff01;由于论文过多&#xff0c;我们将通过两篇文章进行介绍&#xff0c;本篇文章介绍第45--第8…