OpenImaj OutOfMemoryError во время процесса изменения размера - PullRequest
0 голосов
/ 30 апреля 2019

У меня есть две фотографии, одна увеличенная, а вторая - широкоугольная.Рассмотрим первое изображение как обрезку второго (хотя это не так).Я выбираю один пиксель из каждой фотографии, которая представляет одну и ту же вещь на обеих фотографиях (скажем, человеческий нос).Я накладываю первое изображение с некоторой прозрачностью поверх второго изображения, выравнивая два выбранных пикселя?

Теперь я хочу масштабировать второе изображение, пока первое изображение практически не исчезнет, ​​поскольку масштаб второго изображения совпадаетмасштаб первого.

Я использую OpenImaj и успешно выполнил это с помощью MBFImage.overlayInPlace ().У меня проблема в том, что когда я использую ResizeProcessor для масштабирования второго изображения, я получаю «OutOfMemoryError: Java Heap Space», если мне нужно масштабировать второе изображение слишком много (> 5x).

Я столкнулсядо -Xmx до 12G, используя JDK 12 64bit.Я пробовал ResizeProcessor, BilinearInterpolation и BicubicInterpolation resizer все с одинаковым результатом.

Вот мой метод с моей последней попыткой.В зависимости от того, сколько памяти я отдаю JVM, иногда происходит сбой при изменении размера, в других случаях происходит сбой в toRGB ():

private MBFImage scaleImage2(float scaleFactor) throws IOException {
    FImage img2Flat = image2.flatten();
    int width = (int)Math.round(img2Flat.getWidth() * scaleFactor);
    int height = (int)Math.round(img2Flat.getHeight() * scaleFactor);
    BilinearInterpolation resizer = new BilinearInterpolation(width, height, 1/scaleFactor);
    resizer.processImage(img2Flat);
    return img2Flat.toRGB();
}

Вот где я накладываю изображения:

private MBFImage createScaledOverlay() {
    MBFImage scaledImg2 = null;
    if(scaledLastCrop == null) {
        try {
            scaledLastCrop = scaleLastCrop();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    try {
        scaledImg2 = scaleImage2(image2ScaleFactor);
    } catch (IOException e) {
        e.printStackTrace();
    }
    int img2ScaledPixelx = Math.round(image2SelectedPixel.x * image2ScaleFactor);
    int img2ScaledPixely = Math.round(image2SelectedPixel.y * image2ScaleFactor);
    int lastCropScaledPixelx = (int)Math.round(lastCropSelectedPixel.x * lastCropScaleFactor);
    int lastCropScaledPixely = (int)Math.round(lastCropSelectedPixel.y * lastCropScaleFactor);
    scaledImg2.overlayInplace(scaledLastCrop, img2ScaledPixelx - lastCropScaledPixelx, img2ScaledPixely - lastCropScaledPixely);
    return scaledImg2;
}

У меня все в порядке с одним из двух путей вперед:

  1. Исправлено OutOfMemoryError
  2. Другой подход к наложению двух изображений

1 Ответ

0 голосов
/ 02 мая 2019

Иногда решение настолько очевидно, что это смущает.

Моя настоящая цель, теперь, когда я об этом думаю, - найти коэффициент масштабирования между двумя изображениями.Вместо увеличения изображения 2, я могу уменьшить изображение 1.Это намного менее интенсивно использует память.Затем, что касается image2, я могу просто инвертировать этот масштабный коэффициент.

...