调整大小过程中的 OpenImaj OutOfMemoryError
OpenImaj OutOfMemoryError during Resize Process
我有两张照片,一张是放大的,第二张是大的广角照片。考虑第一张图片是第二张图片的裁剪(尽管不是)。我 select 每张照片中的一个像素在两张照片中代表相同的东西(比如男人的鼻子)。我将第一张图片叠加在第二张图片之上,将两个 selected 像素对齐?
现在我想缩放第二张图片直到第一张图片基本消失,因为第二张图片的比例与第一张图片的比例一致。
我正在使用 OpenImaj,并已使用 MBFImage.overlayInPlace() 成功完成此操作。我遇到的问题是,当我使用 ResizeProcessor 缩放第二张图像时,如果我必须将第二张图像缩放太多( >5x ),我会得到一个 "OutOfMemoryError: Java Heap Space"。
我使用 JDK 12 64 位将 -Xmx 增加到 12G。
我尝试了 ResizeProcessor、BilinearInterpolation 和 BicubicInterpolation resizers,结果都一样。
这是我最近尝试的方法。取决于我给 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;
}
我同意两条前进道路中的一条:
- 修复 OutOfMemory 错误
- 另一种叠加两张图片的方法
有时一个解决方案是如此明显以至于令人尴尬。
我的真正目标,现在我想起来了,是找到两个图像之间的比例因子。我可以缩小 image1,而不是放大 image2。这占用的内存少得多。然后关于 image2 我可以反转这个比例因子。
我有两张照片,一张是放大的,第二张是大的广角照片。考虑第一张图片是第二张图片的裁剪(尽管不是)。我 select 每张照片中的一个像素在两张照片中代表相同的东西(比如男人的鼻子)。我将第一张图片叠加在第二张图片之上,将两个 selected 像素对齐?
现在我想缩放第二张图片直到第一张图片基本消失,因为第二张图片的比例与第一张图片的比例一致。
我正在使用 OpenImaj,并已使用 MBFImage.overlayInPlace() 成功完成此操作。我遇到的问题是,当我使用 ResizeProcessor 缩放第二张图像时,如果我必须将第二张图像缩放太多( >5x ),我会得到一个 "OutOfMemoryError: Java Heap Space"。
我使用 JDK 12 64 位将 -Xmx 增加到 12G。 我尝试了 ResizeProcessor、BilinearInterpolation 和 BicubicInterpolation resizers,结果都一样。
这是我最近尝试的方法。取决于我给 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;
}
我同意两条前进道路中的一条:
- 修复 OutOfMemory 错误
- 另一种叠加两张图片的方法
有时一个解决方案是如此明显以至于令人尴尬。
我的真正目标,现在我想起来了,是找到两个图像之间的比例因子。我可以缩小 image1,而不是放大 image2。这占用的内存少得多。然后关于 image2 我可以反转这个比例因子。