【问题标题】:Drawing in greyscale produces color shift灰度绘图会产生颜色偏移
【发布时间】: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


【解决方案1】:

所以我稍微检查了一下代码,出于绝望,我开始关闭不应该但可能会产生影响的东西。原来罪魁祸首是

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

这个提示没有...提示...一个人究竟如何从平均 84 倍于 16384 中得到除 16384 之外的其他值,但是,嘿,我该判断谁。

此提示状态的文档

RENDERING 提示是提供高级别的通用提示 关于是否为了速度而更多地偏向算法选择的建议 或评估权衡时的质量。任何渲染或图像处理操作都可以参考此提示,但决策通常会优先考虑其他更具体的提示,而不是此提示。

也不是很有帮助。

在 java2d 中使用渲染提示时,我确实遇到了一些挫折,而且似乎确实有一些问题。

【讨论】:

  • 没有这个,你可能会得到最近邻“插值”。
  • 这听起来很对。如果我想考虑所有受影响的值,我想我必须实现自己的采样器。
  • 看看我的github.com/MarkJeronimus/ImageUtilities。它需要每通道 16 位的支持,但算法都在那里,并且是多线程的(与有缺陷的“java-image-scaling”项目相反)。如果你想一起工作,你甚至可以分叉它。
猜你喜欢
  • 2012-11-06
  • 2015-04-22
  • 2013-05-08
  • 2012-04-29
  • 2020-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-04
相关资源
最近更新 更多