我有两张照片,一张放大了,第二张是大的广角照片。考虑第一个图像是第二个图像的裁剪(尽管不是)。我从每张照片中选择一个代表两个图片中相同事物的像素(例如,一个人的鼻子)。我在第二张图片的顶部覆盖了第一张图片,并使其具有一定的透明度,以使两个选定的像素对齐?

现在,我想缩放第二张图像,直到第一张图像基本消失为止,因为第二张图像的比例与第一张图像的比例匹配。

我正在使用OpenImaj,并已使用MBFImage.overlayInPlace()成功完成了此操作。我遇到的问题是,当我使用ResizeProcessor缩放第二张图像时,如果我不得不缩放第二张图像过多(> 5x),则会收到“ OutOfMemoryError:Java堆空间”。

我已经使用JDK 12 64bit将-Xmx提高到了12G。
我已经尝试过ResizeProcessor,BilinearInterpolation和BicubicInterpolation大小调整器,它们的结果相同。

这是我最近尝试的方法。根据我给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;
}


我可以采用以下两种方法之一:


修复OutOfMemoryError
覆盖两个图像的另一种方法

最佳答案

有时,解决方案是如此明显,令人尴尬。

考虑到这一点,我的真正目标是找到两个图像之间的比例因子。我可以按比例缩小image1而不是按比例放大image2。这大大减少了内存消耗。然后关于image2我可以反转这个比例因子。

关于java - 调整大小过程中的OpenImaj OutOfMemoryError,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55912759/

10-09 04:54