Android / Tensorflow将Bitmap.getPixels转换为RGB像素值会导致颜色不正确

时间:2018-02-01 20:22:15

标签: android tensorflow

我使用Tensorflow构建了一个图像分类器,我使用Android Tensorflow库在Android上运行。我的问题是,在Android上对图像进行分类时,预测的类完全关闭。但是当使用相同模型的Python对图像进行分类时,预测的类是正确的。

以下方法是我将位图转换为RGB像素值数组的方法。(我从sample-tensorflow-imageclassifierhere获取。)

    public static float[] getPixels(Bitmap bitmap) {

        final int IMAGE_SIZE = 168;

        int[] intValues = new int[IMAGE_SIZE * IMAGE_SIZE];
        float[] floatValues = new float[IMAGE_SIZE * IMAGE_SIZE * 3];

        if (bitmap.getWidth() != IMAGE_SIZE || bitmap.getHeight() != IMAGE_SIZE) {
            // rescale the bitmap if needed
            bitmap = ThumbnailUtils.extractThumbnail(bitmap, IMAGE_SIZE, IMAGE_SIZE);
        }

        bitmap.getPixels(intValues, 0, bitmap.getWidth(), 0, 0, bitmap.getWidth(), bitmap.getHeight());

        for (int i = 0; i < intValues.length; ++i) {
            final int val = intValues[i];
            // bitwise shifting - without our image is shaped [1, 168, 168, 1] but we need [1, 168, 168, 3]
            floatValues[i * 3] = Color.red(val);
            floatValues[i * 3 + 1] = Color.green(val);
            floatValues[i * 3 + 2] = Color.blue(val);
        }
        return floatValues;
    }

我已经尝试将从getPixels(位图:位图)接收的像素的浮点数组转换回Bitmap并注意到颜色的差异,所以我猜这是问题所在?有没有办法转换像素而不会丢失颜色信息?

附上原始图像和应用上述功能后我转换回来的图像。

Original Image

Image converted with above method

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:3)

原来,Bitmap.getPixels反转了RGB通道,因此更改为BGR。

floatValues[i * 3 + 2] = Color.red(val);
floatValues[i * 3 + 1] = Color.green(val);
floatValues[i * 3] = Color.blue(val);