转换为 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 色彩空间 - 许多版本 的相关文章

随机推荐

  • 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