YUV图像处理

Jun*_*ang 0 java android image

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

Edd*_*ala 8

我假设你正在使用Camera API的预览回调,你会得到每帧的byte []数组.

首先,您需要选择要使用的YUV格式.需要支持NV21,自Android 3.0起需要YV12.其他格式均不保证可用.因此NV21是最安全的选择,也是默认选择.

这两种格式都是YUV 4:2:0格式; 颜色信息在两个维度上被二次采样,并且图像数据的布局与标准交错RGB格式相当不同.FourCC.org的NV21描述作为一个源,具有您想要的布局信息 - 首先是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]

Run Code Online (Sandbox Code Playgroud)

也可以使用色度通道的更复杂的上采样(双线性,立方体等),但是什么是合适的取决于应用.

拥有YUV像素后,您需要解释它.如果您更喜欢在RGB中操作,可以在维基百科上使用这些JPEG转换公式来获取RGB值.

或者,你可以使用V(Cr)的大正值来表示红色,特别是如果U(Cb)很小.