【发布时间】:2017-03-01 00:54:25
【问题描述】:
我正在研究高程图层次结构、四叉树,为此我需要将 16 位灰度图像形式的高程数据集处理成不同级别的不同图像。这主要是对输入数据进行下采样。
考虑输入大小为 14401x10801 的平铺图像,它应该被绘制成 512x512 图像的一部分。
Draw 调用看起来像这样:
Graphics2D g2d = (Graphics2D) dstImage.getGraphics();
...
BufferedImage clip = sourceImage.getSubimage(srcX, srcY, srcWidth, srcHeight);
g2d.drawImage(clip , dstX, dstY, dstWidth, dstHeight, null);
在哪里
srcX = srcY = 0
srcWidth = 14401
srcHeight = 10801
dstX = dstY = 0
dstWidth = 171
dstHeight = 128
被填充的区域相对而言是正确的,这意味着峰在它们应该在的位置。问题是,这些值并不完全符合您的预期。具体来说,dst 中的像素 0,0 肯定是海拔为零的海,但在其中绘制了值 64。
查看src图片的内容
sourceImage.getSubimage( 0, 0,
(int)(srcWidth/(double)dstWidth),
(int)(srcHeight/(double)dstHeight));
应该从 src 图像中产生或多或少的值,这些值进入 dst 中的像素 0,0。这些都是零,所以我认为问题不在于某个峰值会影响价值。更令人费解的是,所有应该为零的像素都设置为64。
出于此处理的目的(因为 java 无法处理 16 位灰度中的负值),所有像素都被提升 16384。仅将这些像素提升 1000 会导致错误 -229 而不是 64。值更改很简单“添加到所有输入" -> "过程" -> "从所有输出中减去"。
我希望通过简单地对图像进行所有工作来避免所有重新采样、裁剪和效率问题,但到目前为止,java 似乎做了一些模糊的颜色映射。
任何想法我可能做错了什么?
【问题讨论】:
-
不需要剪裁图片。只需将其绘制在目标边界之外的坐标处
-
子图像是用于上采样的,我知道这里没有必要。
-
在下采样时你能看到相邻像素的插值吗?
-
@jimmyB 不确定我是否遵循,与 dst 中的像素对应的 src 中的所有像素都为零,所以没有进行插值?
-
@MarkJeronimus 现在想一想,你是对的,不确定子图像调用背后的最初动机是什么,可能会在重叠较小时减少较低级别的丢弃像素数量。
标签: java image graphics2d