gpt4 book ai didi

java - 如何使用灰度像素值从 Bitmap 创建 ByteBuffer?

转载 作者:行者123 更新时间:2023-12-01 14:33:51 25 4
gpt4 key购买 nike

我正在尝试在我的 Android 应用程序中使用 tflite 模型。当我必须从位图中创建一个 ByteBuffer 并将其用作模型的输入时,问题就出现了。

问题:位图是 ARGB_8888(32 位),而我需要(8 位)灰度图像。

Bitmap转ByteBuffer的方法:

mImgData = ByteBuffer
.allocateDirect(4 * 28 * 28 * 1);

private void convertBitmapToByteBuffer(Bitmap bitmap) throws NullPointerException {
if (mImgData == null) {
throw new NullPointerException("Error: ByteBuffer not initialized.");
}

mImgData.rewind();

for (int i = 0; i < DIM_IMG_SIZE_WIDTH; i++) {
for (int j = 0; j < DIM_IMG_SIZE_HEIGHT; j++) {
int pixelIntensity = bitmap.getPixel(i, j);
unpackPixel(pixelIntensity, i, j);
Log.d(TAG, String.format("convertBitmapToByteBuffer: %d -> %f", pixelIntensity, convertToGrayScale(pixelIntensity)));
mImgData.putFloat(convertToGrayScale(pixelIntensity));
}
}

}

private float convertToGrayScale(int color) {
return (((color >> 16) & 0xFF) + ((color >> 8) & 0xFF) + (color & 0xFF)) / 3.0f / 255.0f;
}

但是,所有像素值要么是 -1 要么是 -16777216。请注意,unpackPixel 方法提到了 here不起作用,因为无论如何所有值都具有相同的 int 值。 (在下面发布更改以供引用。)

private void unpackPixel(int pixel, int row, int col) {
short red,green,blue;
red = (short) ((pixel >> 16) & 0xFF);
green = (short) ((pixel >> 8) & 0xFF);
blue = (short) ((pixel >> 0) & 0xFF);
}

最佳答案

您可以在像素值上调用 Color.red() 或 green/blue,它将返回灰度强度。然后使用 putFloat() 将其放入字节缓冲区。使用 bitmap.getPixels() 获取单个数组中的所有像素值也比 bitmap.getPixel(i, j) 更快。这是我在我的 tflite 模型中加载灰度图像的方法:

private ByteBuffer getByteBuffer(Bitmap bitmap){
int width = bitmap.getWidth();
int height = bitmap.getHeight();
ByteBuffer mImgData = ByteBuffer
.allocateDirect(4 * width * height);
mImgData.order(ByteOrder.nativeOrder());
int[] pixels = new int[width*height];
bitmap.getPixels(pixels, 0, width, 0, 0, width, height);
for (int pixel : pixels) {
mImgData.putFloat((float) Color.red(pixel));
}
return mImgData;
}

如果您需要标准化值,只需除以 255:

float value = (float) Color.red(pixel)/255.0f;
mImgData.putFloat(value);

然后您可以在您的解释器中使用它:

ByteBuffer input = getByteBuffer(bitmap);
tflite.run(input, outputValue);

希望这可以帮助人们在未来寻找它!

关于java - 如何使用灰度像素值从 Bitmap 创建 ByteBuffer?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52020362/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com