Уменьшение растрового изображения в Android - PullRequest
0 голосов
/ 13 апреля 2020

Я пытаюсь создать приложение с моделью TensorFlow Lite для распознавания рукописных цифр. Я создал простой холст для рисования пользователем, который возвращает растровое изображение для всего, что нарисовал пользователь. Начальный размер растрового изображения 523 x 1024 , который я пытаюсь уменьшить до 28 x 28 , чтобы передать его в качестве входных данных для моей модели. Однако уменьшенное изображение почти до неузнаваемости.

Я даже пытался изменить масштаб растрового изображения с помощью { ссылка }, но безрезультатно. Прикрепление скриншотов для справки Уменьшенное изображение . Несжатое изображение

Любое понимание будет с благодарностью. Спасибо

fun classify(bitmap: Bitmap) {
    check(isInterpreterInitialized) {"TFLite interpreter is not initialised"}
    val resizedImage = Bitmap.createScaledBitmap(bitmap, inputImageWidth, inputImageHeight, true)
    val bitmapByteBuffer = resizedImage?.toByteBuffer()
    getCompressedBitmap(bitmap)
    bitmapByteBuffer?.let {
      interpreter?.run(it, resultArray)
    }

  }

1 Ответ

0 голосов
/ 13 апреля 2020

Вы уменьшаете масштаб без сохранения соотношения сторон, которое может быть причиной проблемы. 28 * 28 пикселей - это действительно изображение с очень низким разрешением, поэтому, возможно, вы не сможете его распознать.

Я уверен, что это из-за соотношения сторон. Сохраняйте пропорции - также старайтесь постепенно уменьшать ширину, пока она не будет распознана. Вот соответствующий код java попробуйте это: -

public static Bitmap resizeBitmapWithPreservedAspectRatio(Bitmap bmp,
    int desiredWidth, int desiredHeight) {
    Matrix mat = new Matrix();
    float sx = (float) desiredWidth / bmp.getWidth();
    float sy = (float) desiredHeight / bmp.getHeight();
    if(desiredWidth>desiredHeight){
    mat.postScale(sx, sx);
    }else{
        mat.postScale(sy, sy);
    }
    bmp = Bitmap.createBitmap(bmp, 0, 0, bmp.getWidth(), bmp.getHeight(),
            mat, false);
    return bmp;
}

public static Bitmap resizeBitmapWithoutPreservingAspectRatio(Bitmap bmp,
    int desiredWidth, int desiredHeight) {
    Matrix mat = new Matrix();
    float sx = (float) desiredWidth / bmp.getWidth();
    float sy = (float) desiredHeight / bmp.getHeight();
    mat.postScale(sx, sy);
    bmp = Bitmap.createBitmap(bmp, 0, 0, bmp.getWidth(), bmp.getHeight(),
            mat, false);
    return bmp;
}
...