YUV420 到 RGB 转换

2024-04-16

我使用以下公式将 RGB 矩阵转换为 YUV 矩阵:

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

然后我在矩阵上进行了 4:2:0 色度子采样。我认为我这样做是正确的,我从 YUV 矩阵中取出 2x2 子矩阵,将值从最小到最大排序,并取中间 2 个值之间的平均值。

然后我使用维基百科上的这个公式来访问 Y、U 和 V 平面:

size.total = size.width * size.height;
y = yuv[position.y * size.width + position.x];
u = yuv[(position.y / 2) * (size.width / 2) + (position.x / 2) + size.total];
v = yuv[(position.y / 2) * (size.width / 2) + (position.x / 2) + size.total + (size.total / 4)];

我正在使用 OpenCV,所以我尝试尽我所能解释这一点:

y = src.data[(i*channels)+(j*step)];
u = src.data[(j%4)*step + ((i%2)*channels+1) + max];
v = src.data[(j%4)*step + ((i%2)*channels+2) + max + (max%4)];

src 是 YUV 子采样矩阵。我对这个公式的解释正确吗?

以下是我将颜色转换回 RGB 的方法:

bgr.data[(i*channels)+(j*step)] = (1.164 * (y - 16)) + (2.018 * (u - 128)); // B
bgr.data[(i*channels+1)+(j*step)] = (1.164 * (y - 16)) - (0.813 * (v - 128)) - (0.391 * (u - 128)); // G
bgr.data[(i*channels+2)+(j*step)] = (1.164 * (y - 16)) + (1.596 * (v - 128));   // R

问题是我的图像没有恢复到原来的颜色。

以下是供参考的图像:https://i.stack.imgur.com/vQkpT.jpg https://i.stack.imgur.com/vQkpT.jpg(二次采样)https://i.stack.imgur.com/Oucc5.jpg https://i.stack.imgur.com/Oucc5.jpg(输出)

我发现我现在应该从 YUV444 转换为 RGB,但我不太明白我在 Wiki 上找到的示例中的剪辑函数的作用。

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)

>> 是否意味着我应该移位?

我将不胜感激任何帮助/评论!谢谢

Update

尝试进行 YUV444 转换,但它只是让我的图像显示为绿色阴影。

        y = src.data[(i*channels)+(j*step)];
        u = src.data[(j%4)*step + ((i%2)*channels+1) + max];
        v = src.data[(j%4)*step + ((i%2)*channels+2) + max + (max%4)];

        c = y - 16;
        d = u - 128;
        e = v - 128;

        bgr.data[(i*channels+2)+(j*step)] = clip((298*c + 409*e + 128)/256);
        bgr.data[(i*channels+1)+(j*step)] = clip((298*c - 100*d - 208*e + 128)/256);
        bgr.data[(i*channels)+(j*step)] = clip((298*c + 516*d + 128)/256);

我的剪辑功能: int 剪辑(双精度值) { 返回(值> 255)? 255:(值


将 WebM 帧解码为 RGB 时我遇到了同样的问题。经过几个小时的搜索,我终于找到了解决方案。

从这里获取 SCALEYUV 函数:http://www.telegraphics.com.au/svn/webpformat/trunk/webpformat.h http://www.telegraphics.com.au/svn/webpformat/trunk/webpformat.h

然后要从 YUV 解码 RGB 数据,请参阅此文件:http://www.telegraphics.com.au/svn/webpformat/trunk/decode.c http://www.telegraphics.com.au/svn/webpformat/trunk/decode.c

搜索“py = img->planes[0];”,有两种算法可以转换数据。我只尝试了简单的一种(在“//然后退回到更便宜的方法。”之后)。

代码中的注释也参考了这个页面:http://www.poynton.com/notes/colour_and_gamma/ColorFAQ.html#RTFoC30 http://www.poynton.com/notes/colour_and_gamma/ColorFAQ.html#RTFToC30

对我来说效果很好。

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

YUV420 到 RGB 转换 的相关文章

  • 尝试导入 cv2(opencv-python) 包时出错

    我正在尝试使用 cv2 opencv python 包访问我的网络摄像头 当我尝试导入它时 出现此错误 Traceback most recent call last File server py line 6 in
  • 如何加载4通道的png图像?

    我一直在尝试加载带有透明通道 RGB 和 Alph 的 png 文件 但没有成功 看来 openCV 从图像中剥离了第四个通道 即使我必须修改 OpenCV 源代码并重建它 是否有任何方法可以加载包含 alpha 通道在内的完整 4 个通道
  • 尝试捕获默认 iSight 相机时 OpenCV 崩溃

    我正在尝试让 openCV 在我的 Macbook Pro 10 8 5 视网膜型号 上运行 并且我想使用默认的 iSight 摄像头进行输入 因为如果我不这样做 我不想随身携带或购买 USB 摄像头不需要 我正在使用 OpenCV 用户文
  • 增加图像亮度而不溢出

    我在尝试增加图像亮度时遇到问题 这是原始图像 我想要得到的图像是这样的 现在使用以下代码增加亮度 image cv2 imread home wni vbshare tmp a4 index2 png 0 if sum image 0 le
  • 使用 OpenCV 进行车牌识别

    我有一个项目 需要使用 OpenCV 识别汽车的车牌 我想加载数字或字母的图像 让 OpenCV 识别它并将其打印到控制台 有一个函数可以做到这一点吗 如果没有 我该怎么办 Note 我正在研究灰度级 请帮忙 我必须在一周后完成 谢谢你的快
  • 如何在win32上安装OpenCV 2.0

    我需要在 Win32 上安装 OpenCV 我目前没有安装它 我下载了 OpenCV 2 0 0a win32 exe 并运行它 我现在到底该怎么办 没有 lib之类的东西 我找到了一些使用 cmake 构建版本的说明 http openc
  • 为 Visual Studio 安装 openCV 2.4 for C/C++

    我一整天都在尝试在 Windows 7 上的 C C 上安装 Visual Studio 2010 的 OpenCV 版本 2 4 1 和 2 4 2 我一直在关注这个教程 http docs opencv org trunk doc tu
  • 相机姿态估计(OpenCV PnP)

    我正在尝试使用网络摄像头从具有已知全球位置的四个基准点的图像中获取全局姿态估计 我检查了许多 stackexchange 问题和一些论文 但似乎无法得到正确的解决方案 我得到的位置数字是可重复的 但与相机移动绝不成线性比例 仅供参考 我正在
  • cv2.cv.BoxPoints(rect) 返回什么?

    rect cv2 minAreaRect largest contour rect rect 0 0 self scale down rect 0 1 self scale down rect 1 0 self scale down rec
  • 如何将 OpenCV 等待键与 Chaquopy 一起使用

    我正在尝试使用 Chaquopy 将计算机视觉应用程序移植到 Android 当我尝试运行脚本时 以下行中出现以下错误 cv2 waitKey 100 打印到嵌入式 python 控制台的错误是 java chaquopy CQPEnv c
  • 如何使用 c 使用 libpng 更改 png 图像的 RGB 值?

    更改 png 图像的 rgb 值的推荐方法是什么 现在我正在使用示例代码来查看 libpng 的工作方式 它只打开一个 png 图像并写入另一个 png 图像 但是我想更改这个新图像的 RGB 值 使其变为全蓝色 绿色或红色 无论我选择什么
  • 查找彼此接近的对象边界

    我正在研究一个计算机视觉问题 其中问题的第一步是找到物体彼此靠近的位置 例如 在下图中 我感兴趣的是找到灰色标记的区域 Input Output 我目前的方法是首先反转图像 然后通过侵蚀进行形态梯度跟随 然后删除一些不感兴趣的轮廓 脚本如下
  • 计算两个描述符之间的距离

    我正在尝试计算已计算的两个描述符之间的距离 欧几里得或汉明 问题是我不想使用匹配器 我只想计算两个描述符之间的距离 我正在使用 OpenCV 2 4 9 并且我的描述符存储在 Mat 类型中 Mat descriptors1 Mat des
  • opencv中矩阵的超快中值(与matlab一样快)

    我正在 openCV 中编写一些代码 想要找到一个非常大的矩阵数组 单通道灰度 浮点数 的中值 我尝试了几种方法 例如对数组进行排序 使用 std sort 和选择中间条目 但与 matlab 中的中值函数相比 它非常慢 准确地说 在 ma
  • Opencv未找到所有轮廓

    我试图找到该图像的轮廓 但是该方法查找轮廓只返回1轮廓 轮廓突出显示image 2 我正在努力寻找all外部轮廓就像这些圆圈 里面有数字 我究竟做错了什么 我可以做什么来实现它 image 1 image 2 以下是我的代码的相关部分 th
  • 改变 RGB 颜色的色调

    我正在尝试编写一个函数来改变 RGB 颜色的色调 具体来说 我在 iOS 应用程序中使用它 但数学是通用的 下图显示了 R G 和 B 值如何随色调变化 看起来 编写一个函数来改变色调似乎应该是一个相对简单的事情 而不需要对不同的颜色格式进
  • 如何删除树莓派的相机预览

    我在我的 raspberryPi 上安装了 SimpleCv 并安装了用于使用相机板的驱动程序 uv4l 驱动程序 现在我想使用它 当我在 simpleCV shell Camera 0 getImage save foo jpg 上键入时
  • 使用opencv计算深度视差图

    我无法使用 opencv 从视差图计算深度 我知道两个立体图像中的距离是用以下公式计算的z baseline focal disparity p 但我不知道如何使用地图计算视差 我使用的代码如下 为我提供了两个图像的视差图 import n
  • 曲线/路径骨架二值图像处理

    我正在尝试开发一个可以处理图像骨架的路径 曲线的代码 我想要一个来自两点之间骨架的点向量 该代码在添加一些点后结束 我没有找到解决方案 include opencv2 highgui highgui hpp include opencv2
  • OpenCV 仅围绕大轮廓绘制矩形?

    第一次发帖 希望我以正确的方式放置代码 我正在尝试检测和计算视频中的车辆 因此 如果您查看下面的代码 我会在阈值处理和膨胀后找到图像的轮廓 然后我使用 drawContours 和矩形在检测到的轮廓周围绘制一个框 我试图在 drawCont

随机推荐

  • 如何递归探索Python嵌套字典? [复制]

    这个问题在这里已经有答案了 我很好奇是否有一种方法可以在 python 中递归地探索嵌套字典 我的意思是 假设我们有一个如下示例 d a b c 1 2 3 获取最里面字典的内容需要什么代码 c 1 2 3 遍历a and b 在这种情况下
  • userLocation:纬度/经度返回零?

    我只是在查看 mapKit 并决定创建一个快速按钮来显示我当前的位置 但是当我按下该按钮时 我的纬度 经度始终显示为 0 000000 0 000000 地图视图已加载 因为在按下按钮之前我可以在模拟器上看到地图 以前 我通过使用 core
  • 向 Web 应用程序的所有 HTML 元素添加 ID 属性?

    目前 我正在使用 RoR MySQL HTML CSS 和 jQuery 等构建一个 Web 门户 我收到自动化测试工程师的请求 要求向我的应用程序的所有元素添加 ID 属性 如果可能的话 还有 NAME 属性 我对此感到困惑 也许我不确定
  • Bootstrap 卡头 - 所有卡头高度相同

    我在两个网页上使用引导卡 在一页上 标题文本是固定的 因此我可以使用 min height 来匹配其卡片标题高度 在第二页上 将生成这些卡片 因此我不知道文本长度和单词 我希望连续的所有卡头都具有相同的高度 有没有办法根据一行中最大的卡头计
  • 使用 xpose 挂接一个以自定义类数组作为参数的方法

    如何挂钩包含自定义类数组的方法 Lcom samsung android uniform widget notification NotificationItem 这就是 smali 论证 我可以上课XposedHelpers findCl
  • 显示从 SBT 构建发出的确切 scala 命令

    当我针对本地版本的 Scala 构建我的 相对复杂的 SBT 项目时 出现以下错误 scalac error bad option Ydelambdafy method 这可能是一个错误scalac或我们的构建文件 但是 我无法在调用时重现
  • 无法在守护进程模式下运行 Ansible

    我可以运行 Ansible 像守护进程一样管理我的主机吗 例如 我有时会更改我的剧本 但我不想手动运行 ansible playbook main yml 请不要建议 crontab 有一个特定的点 我不能在生产服务器上使用 crontab
  • sun.* 包发生了什么

    我在 JDK 7 文档中没有找到任何关于sun 包 是否已弃用 但替代品是什么 For eg sun reflect 已被弃用 那么现在有什么选择呢 如果有人可以发布已弃用的软件包和可用的新选项 那就太好了 Note I succeded
  • c中如何检查字符串中的重复字符

    我正在尝试创建一个程序来检查命令行参数字符串中的重复字符 该字符串假定仅包含 26 个字符 并且所有字符都必须是字母顺序的 但是 字符串中不能有任何重复的字符 每个字母字符只能出现一次 我弄清楚了程序的前两部分 但我不知道如何检查重复的字符
  • 多线程代理检查器

    我有很少的代码 例如 using WebClient wc new WebClient wc Proxy new WebProxy IP Port resume if wc IsBusy string rtn msg string Empt
  • 使用 php 从 mysql 删除逗号

    我有一个列名称战斗机 其中包含 mysql 中的一些值 例如 战士 摇滚 约翰 塞纳 承办人 所以 我希望当我在浏览器中显示它时 它应该看起来像 Rock 约翰 塞纳 送葬者 我只想使用 PHP 从数据库中删除逗号 任何帮助将不胜感激 Gi
  • Tweetsharp 授权不呈现 oauth 令牌

    我正在尝试在我的 asp net mvc 3 应用程序中实现 tweetsharp 但遇到了问题 我使用以下设置创建了一个新的 Twitter 应用程序 申请网站 http 127 0 0 1 8545 http 127 0 0 1 854
  • 当互联网连接或断开时收到通知

    我有一个在 Net 4 0 客户端下开发的 WPF 和 C 桌面应用程序 必须根据 PC 上的互联网是否可用来显示或隐藏某些数据的框架 这意味着我必须能够尽快检测到互联网是否断开或连接 以便做出反应 例如 断开无线网络或拔掉网络电缆 当我进
  • Angular 6 构建中的 style.js 是什么

    偷看html源代码 我使用 sass 使用 ng 6 构建 SPA 我找到了这些文件列表 我想知道 style js 是做什么用的 我正在
  • VIM自动插入PHPdoc

    有没有办法使用命令或组合键在 VIM 中插入 PHPDoc 例如 我有一堂课 class MyClass public function construct public function destruct command here to
  • 没有扩展名的文件名叫什么?

    给定文件名foo bar baz 我们可以说foo is the dirname bar baz is the basename and baz is the extname 但是有没有一个类似的术语可以用来表示foo bar or bar
  • C++ 没有 DELETE 宏的原因

    在那儿任何好的理由 也许除了 宏是邪恶的 不使用以下宏 define DELETE ptr if ptr NULL delete ptr ptr NULL define DELETE TABLE ptr if ptr NULL delete
  • 如何应用iOS VNImageHomographicAlignmentObservation warpTransform?

    我正在测试 Apple 的 Vision Alignment API 并对 VNHomgraphicImageRegistrationRequest 有疑问 有人让它工作吗 我可以从中得到 warpTransform 但我还没有看到一个有意
  • 如何通过FTP将多个多级(不同层次)文件从本地版本覆盖到在线版本

    我只是在本地更改了几个不同目录中的许多文件 然后将更改推送到 Subversion 但这不会更改实时版本 只会更改存储库 现在我必须通过 FTP 更新这些文件 但它们都是不同的层次结构级别 我怎么做 我知道的唯一方法是采用我的整个本地版本并
  • YUV420 到 RGB 转换

    我使用以下公式将 RGB 矩阵转换为 YUV 矩阵 Y 0 257 R 0 504 G 0 098 B 16 Cr V 0 439 R 0 368 G 0 071 B 128 Cb U 0 148 R 0 291 G 0 439 B 128