将RGB565转换为灰度图像(8位)

3
我正在尝试将rgb565图像(从Android手机相机的视频流)转换为灰度(8位)图像。 到目前为止,我已经得到了以下代码(使用Android NDK在本地代码中计算转换)。请注意,我的输入图像为640 * 480,我想裁剪它以使其适合128 * 128缓冲区。
#define RED(a)      ((((a) & 0xf800) >> 11) << 3)
#define GREEN(a)    ((((a) & 0x07e0) >> 5) << 2)
#define BLUE(a)     (((a) & 0x001f) << 3)

typedef unsigned char byte;

void toGreyscale(byte *rgbs, int widthIn, int heightIn, byte *greyscales)
{
    const int textSize = 128;
    int x,y;
    short* rgbPtr = (short*)rgbs;
    byte *greyPtr = greyscales;

    // rgbs arrives in RGB565 (16 bits) format
    for (y=0; y<textSize; y++)
    {
        for (x=0; x<textSize; x++)
        {
            short pixel = *(rgbPtr++);
            int r = RED(pixel);
            int g = GREEN(pixel);
            int b = BLUE(pixel);

            *(greyPtr++) = (byte)((r+g+b) / 3);
        }
        rgbPtr += widthIn - textSize;
    }
}

图像是这样发送到函数的。
jbyte* cImageIn = env->GetByteArrayElements(imageIn, &b);
jbyte* cImageOut = (jbyte*)env->GetDirectBufferAddress(imageOut);
toGreyscale((byte*)cImageIn, widthIn, heightIn, (byte*)cImageOut);

我得到的结果是一张水平翻转的图像(不知道为什么...用于显示结果的UV是正确的...),但最大的问题是当我单独显示它们时,只有红色通道是正确的。绿色和蓝色通道都出现了问题,我不知道原因在哪里。我在互联网上查找了所有资源,并且发现我使用的遮罩都是正确的。您有任何想法错误可能在哪里吗?
谢谢!
1个回答

0

可能是字节序问题?

在将RGB组件移出之前,您可以快速检查通过颠倒16位字的两个字节来解决问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接