YUV图像处理

Posted

技术标签:

【中文标题】YUV图像处理【英文标题】:YUV image processing 【发布时间】:2012-11-22 17:56:31 【问题描述】:

我正在开发一个 android 应用程序,对于从相机传递的每个 YUV 图像,它会从中随机选择 10 个像素并检查它们是红色还是蓝色。 我知道如何对 RGB 图像执行此操作,但不适用于 YUV 格式。 由于运行时间限制,我无法将其逐像素转换为 RGB 图像。

【问题讨论】:

如何在 RGB 中定义颜色是红色还是蓝色?您是否已经检查过 YUV 的基础知识,例如 software.intel.com/sites/products/documentation/hpc/ipp/ippi/…? 【参考方案1】:

我假设您正在使用 Camera API 的预览回调,您可以在其中为每一帧获取一个 byte[] 数据数组。

首先,您需要选择要使用的 YUV 格式。需要支持NV21,Android 3.0以后需要YV12。其他格式均不保证可用。所以NV21是最安全的选择,也是默认的。

这两种格式都是 YUV 4:2:0 格式;颜色信息在两个维度上都进行了 2 倍的二次采样,并且图像数据的布局与标准的交错 RGB 格式有很大不同。 FourCC.org's NV21 description,作为一个来源,有你想要的布局信息——首先是 Y 平面,然后是交错的 UV 数据。但由于这两个颜色平面只有 Y 平面大小的 1/4,因此您必须决定如何对它们进行上采样 - 最简单的是最近邻。所以如果你想从大小为(w,h)的图像中获取像素(x,y),最近邻方法是:


Y = image[ y * w + x];
U = image[ w * h + floor(y/2) * (w/2) + floor(x/2) + 1]
V = image[ w * h + floor(y/2) * (w/2) + floor(x/2) + 0]

也可以对色度通道使用更复杂的上采样(双线性、三次等),但适合的方式取决于应用程序。

获得 YUV 像素后,您需要对其进行解释。如果您更习惯在 RGB 中操作,可以使用Wikipedia 处的这些 JPEG 转换公式来获取 RGB 值。

或者,您可以只使用 V (Cr) 的较大正值来表示红色,尤其是在 U (Cb) 较小的情况下。

【讨论】:

你拯救了我的一天。 @Ghazi 你是如何将字节数组 (yuv) 转换为 nv21 的? @mger NV21其实是一种YUV图像格式的编码格式。两者都驻留在 ByteArray 中。简单来说,你的 YUV 数组是兼容 NV21 的,如果你是从安卓的摄像头获取的。【参考方案2】:

来自 Reuben Scratton 的回答 Converting YUV->RGB(Image processing)->YUV during onPreviewFrame in android?

您可以让相机预览使用 RGB 格式而不是 YUV。

试试这个:

Camera.Parameters.setPreviewFormat(ImageFormat.RGB_565);

【讨论】:

不保证支持 RGB_565。您需要先检查 getSupportedPreviewFormats (developer.android.com/reference/android/hardware/…) 以查看它是否已列出。【参考方案3】:

YUV 只是另一种色彩空间。您可以在 YUV 空间中定义红色,就像在 RGB 空间中一样。一个简单的calculator 建议 RGB 值 255,0,0(红色)在 YUV 空间中应该显示为 76,84,255,所以只需寻找接近的值。

【讨论】:

@LonelyCoder - 有一段时间,一个跟踪者对我所有的帖子都投了反对票 - 这可能就是原因。

以上是关于YUV图像处理的主要内容,如果未能解决你的问题,请参考以下文章

图像RGB2YUV与YUV2RGB格式互转介绍

当我将我的 rgb 位图转换为 yuv 时,它会产生红色图像。我想以 YUV 格式从图库中读取图像或将 RGB 位图转换为 YUV

音视频 - YUV像素处理

图像YUV格式介绍

图像YUV格式介绍

图像视频编码和FFmpeg-----YUV格式介绍和应用