转换为 YUV / YCbCr 色彩空间 - 许多版本

2023-12-21

有许多不同的 YUV 颜色转换,但它们都有不同的结果!哪一个是官方正确的?

这是我的测试程序的输出。我输入 R=128 G=50 B=50 (最大值为 255)。该表显示了转换后的 YUV 值和重新转换后的 RGB 值(与原始值不匹配)。

./ColourConversion.exe 128 50 50 
         Y         U         V         R         G         B      Name
===============================================================================
         0         0         0       128        50        50      a) Original RGB Values
        79       116       162       128        50        49      b) Microsoft MSDN integer maths
        78       116       162       126        49        47      c) ITU-R BT.601
        73       120       162       127        49        49      d) HDTV ITU-R BT.709
        73       114       202       176        25        48      e) RGB to full-range YCbCr
        78       116       162       126        49        47      f) Book 'Video Demystified'

这是我的代码(C# 语言):

using System;

namespace ColourConversion
{
    class MainClass
    {
        //Turn on debug to enter RGB values in 'red, geen & blue'
        public static bool debug = true;
        public static int red = 128;
        public static int green = 50;
        public static int blue = 50;


        //for printTidy()
        public static string alphabet = "abcdefghijklmnopqrstuvwxyz";
        public static int testCount = 0;

        public static void Main (string[] args)
        {
            //init variables
            int r, g, b, R, G, B, Y, U, V, C, D, E;
            r = g = b = R = G = B = Y = U = V = C = D = E = 0;

            //read user input if not in debug mode
            if (!debug) {
                if (args.Length < 3) {
                    //Print CLI usage
                    Console.WriteLine ("Enter RGB values in the format:");
                    Console.WriteLine ("ColourConversion.exe 255 255 255");
                    return;
                } else {
                    r = clip(int.Parse (args[0]));
                    g = clip(int.Parse (args[1]));
                    b = clip(int.Parse (args[2]));
                }
            }else{
                r = clip(red);
                g = clip(green);
                b = clip(blue);
            }


            //write table header
            Console.Write("Y".PadLeft(10));
            Console.Write("U".PadLeft(10));
            Console.Write("V".PadLeft(10));
            Console.Write("R".PadLeft(10));
            Console.Write("G".PadLeft(10));
            Console.Write("B".PadLeft(10));
            Console.WriteLine("      Name");
            Console.WriteLine("===============================================================================");
            printTidy(Y,U,V,r,g,b, "Original RGB Values");




            //---------------------------------------------------------------
            //Microsoft MSDN integer maths
            //http://msdn.microsoft.com/en-us/library/ms893078
            R = r;
            G = g;
            B = b;

            Y = ((66 * R + 129 * G + 25 * B + 128) >> 8) + 16;
            U = ((-38 * R - 74 * G + 112 * B + 128) >> 8) + 128;
            V = ((112 * R - 94 * G - 18 * B + 128) >> 8) + 128;

            C = Y - 16;
            D = U - 128;
            E = V - 128;

            R = clip ((298 * C + 409 * E + 128) >> 8);
            G = clip ((298 * C - 100 * D - 208 * E + 128) >> 8);
            B = clip ((298 * C + 516 * D + 128) >> 8);

            printTidy(Y,U,V,R,G,B, "Microsoft MSDN integer maths");

            //---------------------------------------------------------------       
            //ITU-R BT.601
            //http://www.equasys.de/colorconversion.html
            R = r;
            G = g;
            B = b;

            //http://www.equasys.de/equasysRGB_YCbCrColorConversionSDTV.png
            Y = clip(16 + (0.257 * R + 0.504 * G + 0.098 * B));
            U = clip(128 + (-0.148 * R + -0.291 * G + 0.439 * B));
            V = clip(128 + (0.439 * R + -0.368 * G + -0.071 * B));

            //http://www.equasys.de/equasysYCbCr_RGBColorConversionSDTV.png
            R = clip(1.164 * (Y - 16) + 0.0 * (U - 128) + 1.596 * (V - 128));
            G = clip(1.164 * (Y - 16) + -0.392 * (U - 128) + -0.813 * (V - 128));
            B = clip(1.164 * (Y - 16) + 2.017 * (U - 128) + 0.0 * (V - 128));

            printTidy(Y,U,V,R,G,B, "ITU-R BT.601");


            //---------------------------------------------------------------
            //HTDV ITU-R BT.709
            //http://www.equasys.de/colorconversion.html
            R = r;
            G = g;
            B = b;

            //http://www.equasys.de/equasysRGB_YCbCrColorConversionHDTV.png
            Y = clip(16 + ((0.183 * R) + (0.614 * G) + (0.062 * B)));
            U = clip(128 + ((-0.101 * R) +  (-0.339 * G) + (0.439 * B)));
            V = clip(128 + ((0.439 * R) + (-0.399 * G) + (-0.040 * B)));

            //http://www.equasys.de/equasysYCbCr_RGBColorConversionHDTV.png
            R = clip((1.164 * (Y-16)) + (0.0 * (U-128)) + (1.793 * (V-128)));
            G = clip((1.164 * (Y-16)) + (-0.213 * (U-128)) + (-0.533 * (V-128)));
            B = clip((1.164 * (Y-16)) + (2.112 * (U-128)) + (0.0 * (V-128)));

            printTidy(Y,U,V,R,G,B, "HDTV ITU-R BT.709");


            //---------------------------------------------------------------
            //RGB to full-range YCbCr
            //http://www.equasys.de/colorconversion.html
            R = r;
            G = g;
            B = b;

            //http://www.equasys.de/equasysRGB_FullRangeYCbCrColorConversion.png
            Y = clip(0.0 + ((0.299 * R) + (0.587 * G) + (0.114 * B)));
            U = clip(128.0 + ((-0.169 * R) + (-0.331 * G) + (0.500 * B)));
            V = clip(128.0 + ((0.500 * R) + (0.419 * G) + (-0.081 * R)));

            //http://www.equasys.de/equasysFullRangeYCbCr_RGBColorConversion.png
            R = clip((1.0 * Y) + (0.0 * (U - 128)) + (1.4 * (V - 128)));
            G = clip((1.0 * Y) + (-0.343 * (U - 128)) + (-0.711 * (V - 128)));
            B = clip((1.0 * Y) + (1.765 * (U - 128)) + (0.0 * (V - 128)));

            printTidy(Y,U,V,R,G,B, "RGB to full-range YCbCr");


            //---------------------------------------------------------------
            //Book 'Video Demystified' ISBN 1-878707-09-4
            //http://www.fourcc.org/fccyvrgb.php
            R = r;
            G = g;
            B = b;

            Y = clip((0.257 * R) + (0.504 * G) + (0.098 * B) + 16);
            V = clip((0.439 * R) - (0.368 * G) - (0.071 * B) + 128);
            U = clip(-(0.148 * R) - (0.291 * G) + (0.439 * B) + 128);

            B = clip(1.164*(Y - 16) + 2.018*(U - 128));
            G = clip(1.164*(Y - 16) - 0.813*(V - 128) - 0.391*(U - 128));
            R = clip(1.164*(Y - 16) + 1.596*(V - 128));

            printTidy(Y,U,V,R,G,B, "Book 'Video Demystified'");

        }

        //Print output in a nice form
        public static void printTidy(int Y,int U,int V,int R,int G,int B, string methodName)
        {
            Console.Write(Y.ToString().PadLeft(10));
            Console.Write(U.ToString().PadLeft(10));
            Console.Write(V.ToString().PadLeft(10));
            Console.Write(R.ToString().PadLeft(10));
            Console.Write(G.ToString().PadLeft(10));
            Console.Write(B.ToString().PadLeft(10));
            Console.WriteLine("      " + alphabet[testCount++] + ") " + methodName);
            return;
        }

        //overload for clip() - converts double to int
        public static int clip (double d)
        {
            return clip((int)d);
        }

        //clips int to between 0 and 255
        public static int clip (int i)
        {
            if (i < 0)
                return 0;
            if (i > 255)
                return 255;

            return i;
        }
    }
}

没有一个是“官方正确的”,例如,BT.601 适用于 .DV 视频,而其他标准则适用于其他标准......

YUV/YCbCr 颜色的来源是什么?这会告诉你如何转换它。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

转换为 YUV / YCbCr 色彩空间 - 许多版本 的相关文章

  • Automapper、Mapper 未初始化。使用正确的配置调用初始化

    当我尝试将数据提交到数据库时 出现以下错误 Success false Error true ErrorType 2 Message System InvalidOperationException Mapper 未初始化 使用适当的配置调
  • 从服务器下载图像(cUrl,但接受建议)C++

    我试图通过从服务器 网站 下载图像来设置旋转背景图像 并尝试使用curl 来执行此操作 但是在执行此操作方面取得了0 成功 我的代码的 缩短的 版本如下 我没有收到错误 但是 如何 临时 保存该图像以将其显示为背景 是否有图像 类型变量 或
  • C++ STL 映射,std::pair 作为键

    这就是我通过地图定义的方式 std map
  • 地图类容器的专用功能

    我想要专门为矢量和地图之类的容器设计一个函数模板 对于向量 我可以像下面那样做 但我不知道如何才能有一个专门版本的函数 该函数仅用于像地图这样的容器 include
  • 如何在 ASP.NET MVC 中处理会话数据

    假设我想存储一个名为language id在会议中 我想我也许可以做如下的事情 public class CountryController Controller WebMethod EnableSession true AcceptVer
  • 如何在单例类和未命名类之间进行选择?

    我会使用这样的单例 Singleton single Singleton instance single gt do it 我会使用这样的未命名类 single do it 我觉得单例模式除了具有可读的错误消息之外 与未命名的类相比没有任何
  • 使用c#在mac上启动外部进程

    我成功地使用 System Diagnostics Process Start 在 Windows 上启动我的外部单声道可执行文件 然而在mac上却失败了 我没有收到任何错误 只是什么也没发生 我尝试按以下方式进行操作 System Dia
  • 如何在 Windows 上的 GCC 中链接 CS50 C 库

    我是 编程新手 一直在尝试使用以下命令编译我的代码MinGW https en wikipedia org wiki MinGW GCC 但我尝试包括CS50 https en wikipedia org wiki CS50 cs50 c
  • 将 JavaScript 引擎嵌入到 .NET 中 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 只是想知道是否有人尝试过将任何 js 引擎嵌入并实际集成到 net 环境中 我可以找到并实际使用 经过L
  • 向客户端发送状态码 500 时页面未呈现

    我有一个页面 通用处理程序 我想在该页面上向客户端返回状态代码 500 以指示出现问题 我这样做 Response StatusCode 500 Response StatusDescription Internal Server Erro
  • Qt - 添加超链接到对话框

    有没有办法在 Qt 对话框中添加可点击的超链接 IE 它应该看起来像一个超链接 蓝色文本 当您单击它时 它应该在浏览器中打开该超链接 像这样的东西 Use QLabel setOpenExternalLinks bool 并在标签上设置文本
  • 从 SQL 语句中检索元数据(表名)

    我使用的是 Visual Studio 2008 我创建了一个 Winforms 应用程序 并且尝试从 SQL 语句中提取表名 con new SqlConnection connString String queryString Sele
  • ArrayList 有什么问题?

    最近我问了一个关于 SO 的问题 其中提到了可能使用 c ArrayList 来解决问题 有人评论说使用数组列表不好 我想了解更多有关此的信息 我以前从未听说过关于数组列表的这种说法 有人可以带我了解使用数组列表可能出现的性能问题吗 C n
  • 为什么使用 .AsEnumerable() 而不是转换为 IEnumerable

    扩展方法之一IEnumerable
  • 在 OSX 上检测 Objective C 或 C++ 中的文件夹访问(如 fs_usage 命令)

    我正在 OSX 上开发实时病毒扫描程序 OSX 的命令行命令fs usage可以通过以下方式确定文件夹访问权限 并且只能以 root 用户身份运行 fs usage w f pathname grep Users Documents Use
  • 用 std::generate_n 填充 std::map

    我想填写一个std map using std generate n但无法让它发挥作用 我尝试过的是这样的事情 unsigned number of pairs 5 std map
  • Microsoft Visual Studio 2017 中的 wxWidgets 设置

    我花了大约 20 个小时试图弄清楚如何在 Microsoft Visual Studio 2017 中设置 wxWidgets 我遵循 https wiki wxwidgets org Microsoft Visual C 2B 2B Gu
  • 在 C 中运行 setuid 程序的正确方法

    我有一个权限为4750的进程 我的Linux系统中存在两个用户 root 用户和 appz 用户 该进程继承以 appz 用户身份运行的进程管理器的权限 我有两个基本惯例 void do root void int status statu
  • 对 Action 方法的两个并行 ajax 请求排队,为什么?

    我正在使用 ASP NET MVC 开发一个视频网站 我希望在我的应用程序中拥有的一项功能是转码视频 但由于转码过程可能非常耗时 我想向客户端用户展示该过程的进度 因此 我的架构是使用一个控制器操作来处理整个转码过程 并将其进度写入存储在服
  • 在for循环中声明和初始化变量

    可以简单写一下吗 for int i 0 代替 int i for i 0 在 C 或 C 中 并且会变量i只能在循环内部访问 它在 C 中有效 它在 C 的原始版本中是不合法的 但在 C99 中被采用为 C 的一部分 当时一些 C 功能被

随机推荐

  • E2E 测试 - WebdriverJS、Selenium 和 Jasmine

    好的 我遵循了几个略有不同的示例 正 如您在下面的注释代码中看到的那样 他们都声称可以工作 但我无法让它这样做 我在用着 selenium webdriver jasmine node reporter fix jasmine node e
  • 将数据从“datetime_select”转换为 DateTime 对象的 Rails 方法在哪里?

    当我使用在表单中 它会生成如下 HTML
  • Angular 6 应用程序在生产构建后重新加载时中断

    我有一个应用程序 我在其中保存了 dist 文件夹 该文件夹是在我的服务器上成功完成完整生产构建后获得的 一切正常 所有模块和组件都工作正常 直到我手动重新加载浏览器窗口 它才会抛出以下错误 我还使用 base href dist 构建了项
  • 自定义Prolog算术函数

    我正在寻找类似内置算术运算符的东西 它在 Prolog 中 特别是在 SWI Prolog 中 有返回值 例如 如果你跑A is 1 2 3 2 它返回A 8 我该如何定义func运算符做类似的事情 操作员 E g A is 2 func
  • 使用 SQLAlchemy declarative_base() 在 VS Code 中“继承‘Base’,这不是一个类”

    VS 代码显示 继承 Base 它不是一个类 作为错误消息 给出以下内容 from sqlalchemy ext declarative import declarative base from sqlalchemy import Inte
  • Cython“无法获取内存视图切片的地址”

    我在 Cython 中创建一个简单的类时遇到问题 与处理 C 包装器中数组的内存视图相关的文档很少 我想创建一个具有时间 x y 和 z 属性的数据类 我需要这些属性是数组 最终可以在 Python 中调用 我以前使用 numpy 类型进行
  • Java 中的本福德定律 - 如何将数学函数放入 Java 中

    我有一个快速的问题 我正在尝试用java制作一个欺诈检测应用程序 该应用程序将主要基于本福德定律 本福德定律非常酷 它基本上可以解释为在真实的金融交易中 第一个数字通常是 1 2 或 3 很少是 8 9 我还没能得到本福德公式翻译成可以在J
  • 从服务器,如何识别 javascript fetch() 调用(asp.net mvc)

    这并不完全是重复的 下面提供的答案与提议的重复答案中的评论相同 从 asp net 控制器操作内部 我有兴趣了解该调用是否是由 javascript fetch 调用进行的 我可以询问 Request 对象的任何部分来发现这一点吗 例如 如
  • 我应该为 PayPal 沙盒使用什么用户名/密码/签名?

    我正在尝试使用 Paypal NVP API 退款交易 我在沙盒帐户中收到了一些付款 但是当我尝试通过 API 发放退款时 我得到了You do not have permissions to make this API call 但我不确
  • 使用 AVPlayer-Swift 无缝循环视频

    我正在使用 AVPlayer 在后台循环播放本地视频 视频播放正常 但完成视频后需要暂停才能循环播放视频 我尝试了很多方法 也看到了很多关于堆栈溢出的帖子 但我未能找到合适的解决方案 我正在使用 Swift3 代码在这里 var video
  • 使用 openxlsx 导入多个 Excel 工作表

    我正在尝试将一个大型 xlsx 文件导入到包含许多数据表的 R 中 我试图通过这样做XLConnect 但是java内存问题 比如描述的那些在这个线程中 https stackoverflow com questions 21937640
  • 当应用程序处于后台时,单击通知时不会调用 fcm.onNotification()

    我已经安装了 cordova plugin fcm 除了一件小事外 一切正常 当应用程序处于后台 关闭并且从 firebase 发送推送通知时 通知会在设备中弹出 单击托盘中的该通知后 我的应用程序开始运行 但控件未进入 fcm onNot
  • 将 HTML 表导出到 Excel 时编码 UTF-8

    我正在尝试使用 javascript 将 HTML 表导出到 Excel 这是 JavaScript 代码
  • while 循环不会以逻辑条件终止

    如果我添加 OR 条件语句 该循环将不会终止 如果其中一个为假 那么它应该终止 全局变量 int x 100 char n malloc 64 void add void do printf Would you like to add 1
  • 100vw DIV 未显示全宽

    我正在努力让灰色div id ex home bottom container 朝向本页底部http patrickbaker biz starter d http patrickbaker biz starter d 整页的宽度 这意味着
  • 在 woocommerce_get_price_html 挂钩中的价格后添加多语言文本

    我正在构建一个 WooCommerce 网站并对其进行自定义 从互联网库复制并粘贴代码 我已成功在 woocommerce 产品中添加 自定义价格和自定义文本 以便可以将它们翻译成不同的语言 这是产品页面的外观 https www prim
  • 从 Internet 下载 URL 中具有特定日期时间的图像

    我正在尝试开发一个应用程序 该应用程序将使用生成的 Url 路径从 Web 服务器获取文件 网络服务器上每秒都会创建一个新文件 我正在尝试访问该文件并将其显示在 PictureBox 中 旧文件不会被删除 我遇到了一些问题 服务器返回404
  • 使用 linq 检查列表计数是否一致

    州有城市 只有在没有平局的情况下 我才需要拥有大多数城市的州 并列意味着排名前 2 的州拥有相同数量的城市 var stateWithMostCities states OrderByDescending p gt p cities Cou
  • 未找到 PHP 类 DateTime

    声明 DateTime 对象时缺少某些内容PHP 5 3 8 我得到一个带有确定日期时间的 JSON 字符串 该字符串被传递到我的 php 控制器 由于某种原因 我没有将其映射为 php 中的 DateTime 对象 但有点奇怪 请参阅以下
  • 转换为 YUV / YCbCr 色彩空间 - 许多版本

    有许多不同的 YUV 颜色转换 但它们都有不同的结果 哪一个是官方正确的 这是我的测试程序的输出 我输入 R 128 G 50 B 50 最大值为 255 该表显示了转换后的 YUV 值和重新转换后的 RGB 值 与原始值不匹配 Colou