草庐IT

视频ToneMapping(HDR转SDR)中的颜色空间转换问题(BT2020转BT709,YCbCr、YUV和RGB)

q274488181 2023-06-07 原文

笔者按,最近在做视频TM的相关工作,具体是给定一个HDR视频(10bit的YUV420格式),要对其进行TM,写了一个算法但总是有非常离谱的色差,尤其是红色和蓝色通道。仔细检查之后发现是拿到的HDR视频的颜色空间是BT2020的,但转换后的SDR视频是BT709的,需要先对颜色空间进行降级才可以进行处理。这里记录一下处理过程。

首先贴两个地址

[1] ​​​​​​RECOMMENDATION ITU-R BT.2087-0 - Colour conversion from Recommendation ITU-R BT.709 to Recommendation ITU-R BT.2020

[2] REPORT ITU-R BT.2407-0 - Colour gamut conversion from Recommendation ITU-R BT.2020 to Recommendation ITU-R BT.709

这两个都是ITU搞出来的标准纲领性文件。第一个文件讲了怎么把BT709转到2020(包括YUV、RGB的处理办法),第二个讲了怎么把BT2020转换到BT709(但只有RGB信号)。

在文献[2]中,简单粗暴地给出了一个示意图

E'RGB指的是“归一化的非线性RGB值”,而E_RGB指的是“归一化的线性RGB值”。

但在算法中,我拿到的数据是10bit的YUV420数据,所以需要先把10bitYUV420数据转换到E'RGB。怎么转?文献没提。但文献[1]中将如何将709转换到2020时,给了一个图

这里除了 E'RGB和E_RGB之外,还出现了E'YCBCR和D'YCBCR。其中E'YCBCR指的是“归一化的YCBCR值”,而D'YCBCR指的是“量化的YCBCR值”

所以我这里明白了,我在算法输入端所拿到的所谓10bitYUV420数据,实际上就是这个D'YCBCR值。那么接下来,我们结合两篇文献,就可以推导出相应过程了。

Step 1. 将D’YCbCr(2020)转为E’YCbCr(2020)

其实就是如下过程的反过程

 简单推导,得

        E_Y = ((D_Y / 4) - 16) / 219
        E_Cb = ((D_Cb / 4) - 128) / 224
        E_Cr = ((D_Cr / 4) - 128) / 224

Step 2. 将E’YCbCr(2020)转为E’RGB(2020)

文献[1]中给出了反过程

所以这里只要做一个简单的矩阵求逆(这里直接给出了逆)

需要注意的是,下面给出的代码中的E_YCbCr和E_RGB这样的变量,其形状都是height x width x 3的,所以这里讨巧做了一个线性代数的转换,将左乘变成了右乘。下面很多地方都利用了这个方法,后续就不再做解释说明了。

        m_YCbCr2020_to_RGB2020 = np.array([[1.00000000e+00, -7.82308321e-18, 1.47460000e+00],
                                           [1.00000000e+00, -1.64553127e-01, -5.71353127e-01],
                                           [1.00000000e+00, 1.88140000e+00, 2.38961873e-17]])
        E_RGB = np.matmul(E_YCbCr, m_YCbCr2020_to_RGB2020.T)

Step 3. 将E’RGB(2020)转为E RGB(2020)

        E_RGB = np.power(E_RGB, 2)
        # 另一个版本是
        # E_RGB = np.power(E_RGB, 2.4)

Step 4. 将E RGB(2020)转为E RGB(709)

        m_RGB2020_to_RGB709 = np.array([[1.66051121, -0.58771059, -0.07280062],
                                        [-0.12456141,  1.13296051, -0.00839911],
                                        [-0.01816769, -0.1005606,  1.11872828]])
        E_RGB = np.matmul(E_RGB, m_RGB2020_to_RGB709.T)

Step 5. 将E RGB(709)转为E’RGB(709)

        E_RGB = np.power(E_RGB, 1/2)
        # 另一个版本是
        # E_RGB = np.power(E_RGB, 1/2.4)

Step 6.  E’RGB(709)转为D’RGB(709)

【这里是以10bit为例的,如果是8bit,去掉后面的*4即可】

D_RGB = ((E_RGB * 219 + 16) * 4).astype("uint16")

这样转换过后,就没有了色偏问题。

有关视频ToneMapping(HDR转SDR)中的颜色空间转换问题(BT2020转BT709,YCbCr、YUV和RGB)的更多相关文章

  1. ruby - Rails 3 的 RGB 颜色选择器 - 2

    状态:我正在构建一个应用程序,其中需要一个可供用户选择颜色的字段,该字段将包含RGB颜色代码字符串。我已经测试了一个看起来很漂亮但效果不佳的。它是“挑剔的颜色”,并托管在此存储库中:https://github.com/Astorsoft/picky-color.在这里我打开一个关于它的一些问题的问题。问题:请建议我在Rails3应用程序中使用一些颜色选择器。 最佳答案 也许页面上的列表jQueryUIDevelopment:ColorPicker为您提供开箱即用的产品。原因是jQuery现在包含在Rails3应用程序中,因此使用基

  2. Tomcat AJP 文件包含漏洞(CVE-2020-1938) - 2

    目录1.漏洞简介2、AJP13协议介绍Tomcat主要有两大功能:3.Tomcat远程文件包含漏洞分析4.漏洞复现 5、漏洞分析6.RCE实现的原理1.漏洞简介2020年2月20日,公开CNVD的漏洞公告中发现ApacheTomcat文件包含漏洞(CVE-2020-1938)。ApacheTomcat是Apache开源组织开发的用于处理HTTP服务的项目。ApacheTomcat服务器中被发现存在文件包含漏洞,攻击者可利用该漏洞读取或包含Tomcat上所有webapp目录下的任意文件。该漏洞是一个单独的文件包含漏洞,依赖于Tomcat的AJP(定向包协议)。AJP自身存在一定缺陷,导致存在可控

  3. ruby-on-rails - 如何解决#<Book::ActiveRecord_Relation:0x007fb709a6a8c0> 的未定义方法 `to_key'? - 2

    我遇到了未定义方法`to_key'的问题这是我的books_controller.rbclassBooksController和我的索引页如下。index.html.erb......现在当我要访问索引页面时出现如下错误。undefinedmethod`to_key'for# 最佳答案 index通常返回一个集合。事实上,您的Controller符合要求。但是,您的View试图为其定义一个表单。正如您所发现的,这不会成功。表单适用于实体,而不适用于集合。该错误在您看来以及您希望如何处理index。

  4. ruby - 使用 RMagick 将 CMYK 图像正确转换为 RGB - 2

    我一直在使用下面的进行颜色转换if@image.colorspace==Magick::CMYKColorspace#@image.colorspace#=>CMYKColorspace=12@image.colorspace=Magick::RGBColorspace@image=@image.negateend它大致可以工作,但颜色亮度已关闭。我需要否定图像这一事实留下了非常难闻的气味。文档提到使用color_profiles,但除此之外我找不到太多内容。我正在努力@image=@image.quantize(16777216,Magick::RGBColorspace)而且颜色更

  5. javascript - 如何从javascript中的rgb字符串中提取颜色值 - 2

    这个问题在这里已经有了答案:JavascriptRegularExpressionforrgbvalues(10个答案)关闭2年前。Javascript代码$(".designer-element").each(function(){var$this=$(this),varmoot=$this.css(["color","border-color","background-color"]);});用于获取元素颜色。这会将颜色作为字符串返回,例如"background-color":"rgba(0,0,0,0)""border-color":"rgb(211,211,211)""colo

  6. javascript - 正则表达式 javascript 以匹配 RGB 和 RGBA - 2

    目前我有这个与RGB字符串匹配的正则表达式。我需要对其进行增强,使其足够强大以匹配RGB或RGBA。rgbRegex=/^rgb\((\d+),\s*(\d+),\s*(\d+)\)$/;//matchesRGBhttp://jsfiddle.net/YxU2m/varrgbString="rgb(0,70,255)";varRGBAString="rgba(0,70,255,0.5)";varrgbRegex=/^rgb\((\d+),\s*(\d+),\s*(\d+)\)$/;//needhelponthisregex//Ifigureitneedstobe^rgba?,andth

  7. javascript - 你如何在 Javascript 中获得随机 RGB? - 2

    这个问题在这里已经有了答案:Randomcolorgenerator(64个答案)关闭8年前。我有一段使用RGB颜色选择的代码,我想知道如何让JavaScript使用RGB方法随机选择颜色并在整个代码中记住它。编辑:我试过这个:varRGBColor1=(Math.round,Math.random,255)varRGBColor2=(Math.round,Math.random,255)varRGBColor3=(Math.round,Math.random,255)但它不起作用。请帮忙!编辑2:代码使用这个:g.fillStyle="rgba(R,G,B,0.2)";g.strok

  8. javascript - 子字符串、拆分、字符串到数字和 RGB 到十六进制 - 2

    我认为这是一项简单的任务,但它变得非常复杂。请参阅代码。//Convert"rgb(255,255,255)"to(255,255,255)andthentoHexcodevardata={color:"rgb(165,199,72)",color:"rgb(229,121,74)",color:"rgb(105,177,222)"}//rgbToHexConversionvarcomponentToHex=function(c){varhex=c.toString(16);returnhex.length==1?"0"+hex:hex;}varrgbHex=function(r,g,

  9. javascript - 使用 JavaScript 或 jQuery,如何在 <img> 或 <div> 元素中特别是鼠标移动的地方获取 RGB 颜色 - 2

    我有一张图片,.无论何时何地移动鼠标光标,我都试图获得RGB颜色。如何使用jQuery或纯JavaScript执行此操作?例如:http://www.script-tutorials.com/demos/158/index.html跟进(用于复制粘贴测试):headScript();?>$(document).ready(function(){varimage=newImage();varctx=$('#panel')[0].getContext("2d");/*Loadthepictureempty.jpg*/image.onload=function(){ctx.drawImage

  10. javascript - 如何使用 jquery 将 rgb 值转换为十六进制颜色? - 2

    我试图在单击它时获取div的颜色,因为我创建了4个div并为每个div赋予了不同的颜色,我想在单击它时获取div的颜色。我正在获取rgb值的颜色,我想要它的十六进制值,请帮助我。请告诉我如何仅使用jquery将我得到的rgb值转换为十六进制。#first{background-color:red;height:50px;width:50px;/*display:none;*/}#second{background-color:green;height:50px;width:50px;/*display:none;*/}#third{background-color:yellow;hei

随机推荐