Android 规范化位图

Android normalize bitmap

我正在将 Tensorflow 模型集成到 Android 应用程序中,我需要在将图像输入模型之前对其进行预处理。

为此,我需要我的图片:

  1. 将我的图片裁剪到合适的尺寸(这一步没问题):

    Bitmap bitmap_cropped = Bitmap.createScaledBitmap(bitmap, 224, 224,false);

  2. 获取从 0-255 值到 0-1 范围的 RGB 通道。所以基本上将所有像素除以 255。我尝试了下面的代码,但我不确定这是否满足我的需要:

    bitmap_cropped.getPixels(imageBitmapPixels, 0, bitmap_cropped.getWidth(), 0, 0, bitmap_cropped.getWidth(), bitmap_cropped.getHeight());
    for (int i = 0 ; i < imageBitmapPixels.length; i++) {
        imageBitmapPixels[i] = imageBitmapPixels[i]/255;
    }
    

    但是当我显示每个像素的值时,我得到类似的结果

    -12898260
    -12963540
    -12963540
    -11254211
    

我想这 3 个通道是混合的,所以我无法检查是否得到了我想要的。这是正确的方法吗?

这可以让您了解需要做什么

val rgbs = Array(bitmap.width * bitmap.height){
    val x = it % bitmap.height
    val y = it / bitmap.height

    val pixel = bitmap.getPixel(x, y)
    val red = (pixel and 0x00FF0000 shr 16) / 255f
    val green = (pixel and 0x0000FF00 shr 8) / 255f
    val blue = (pixel and 0x000000FF) / 255f

    RGB(red, green, blue)
}

data class RGB(val r: Float, val g: Float, val b: Float)

对不起我的科特林

免责声明 1:此代码性能不佳

disclamer 2:可能有一个库做的几乎相同但速度更快

免责声明 3:上面的代码依赖于您的位图是 ARGB_8888 格式