灰度绘图会产生色移

Drawing in greyscale produces color shift

我正在研究高程图层次结构、四叉树,为此我需要将 16 位灰度图像形式的高程数据集处理成不同级别的不同图像。这大部分是对输入数据进行下采样。

考虑大小为 14401x10801 的输入图块图像,它应该被绘制到 512x512 图像的一部分中。

绘制调用看起来像这样:

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。值更改为简单 "add to all inputs" -> "process" -> "subtract from all outputs".

我希望通过简单地对图像进行所有工作来避免所有重采样、裁剪和效率问题,但到目前为止,java 似乎做了一些模糊的颜色映射。

知道我做错了什么吗?

所以我翻了一下代码,出于绝望开始关闭那些不应该但可能会产生影响的东西。罪魁祸首竟然是

g2d.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);

这个提示不...提示...究竟如何从平均数超过 84 乘以 16384 得到除 16384 之外的其他值,但是嘿,我该判断谁。

此提示的文档说明

The RENDERING hint is a general hint that provides a high level recommendation as to whether to bias algorithm choices more for speed or quality when evaluating tradeoffs. This hint could be consulted for any rendering or image manipulation operation, but decisions will usually honor other, more specific hints in preference to this hint.

也不是很有帮助。

在 java2d 中使用呈现提示时,我确实遇到了一些挫折,看起来确实有一些关于它的东西。