【问题标题】:Quadtree issue - storing redundant info四叉树问题 - 存储冗余信息
【发布时间】:2011-02-17 16:01:35
【问题描述】:

我的图像不是正方形(m x n 尺寸)。此外,它的尺寸不是以 2 为底的(即 m not = 2^k & n not = 2^k)。我已经通过使用以下方法将图像放置在一个更大的正方形(二的下一个幂)中来解决这个问题:

int width = (int)Math.ceil(Math.pow(2, Math.log(img.width)/Math.log(2)));
int height = (int)Math.ceil(Math.pow(2, Math.log(img.height)/Math.log(2)));

根据哪个产生最大尺寸,我将要绘制的正方形设置为最大尺寸,即:

if (img.width > img.height) {
    // draw width * width square
}

if (img.height > img.width) {
    // draw height * height square
}

问题:

四叉树现在看起来完全不同了,因为它在树中存储了所有非图像节点。这显然会影响假定的图像数据(即最小/最大深度)和整个树形本身。我的问题是,我是否以有效的方式执行此操作,如果是,我如何不存储不属于图像的数据?如果这不是绘制非方形图像的最佳方法,有人可以指出我正确的方向吗?谷歌上的所有文章似乎对我来说都太深入了。

【问题讨论】:

  • 四叉树通常用于跟踪世界空间中的对象(物理/逻辑)。这与绘制图像(渲染)有什么关系?
  • 四叉树对于存储具有合理数量的相同颜色区域的图像非常常见。当几个像素上有很多不同的颜色时,它们就不能很好地做到这一点。您需要更大的相同颜色的正方形才能获得不错的压缩效果。

标签: java image image-processing quadtree decomposition


【解决方案1】:

四叉树的好处是它们可以存储大量相同的数据。您额外的空白图像数据应该只会增加您的整体存储大小。我建议,您在存储图像实际原始尺寸的数据结构中添加一些额外的信息。在反序列化您的四叉树时,您可以根据实际尺寸“剪掉”多余的部分以生成原始文件。

【讨论】:

  • 你如何去“砍掉多余的部分”
  • 每当代码处理一个完全超出边界的节点时,忽略它,然后转到下一个节点。你在树上执行什么样的操作?
  • 根据我对 Java 的了解,您可以在反序列化的图像上使用 getSubimage(x, y, width, height)。如果您将原始图像存储在“较大正方形”的 0,0 处,则调用将只是:img.getSubimage(0, 0, originalWidth, originalHeight)。
  • 我需要展示我的代码,但它太大了,无法在此处发布。我该如何解决这个问题?
  • 我不是 Java 专家,但我选择的语言非常相似。关于发布大量代码,我不知道该告诉您什么,但我认为没有必要。我上面提到的getSubimage方法是我在搜索“如何在java中裁剪图像”时发现的。这就是从数据结构重新创建图像后您需要做的所有事情。使用为原始图像大小存储的额外数据构建一个矩形,用于将图像裁剪回其原始大小;有效地切断了多余的部分。
【解决方案2】:

也许不是让你的树终止于(名义上的)单个像素,它可以存储 p 像素乘 o 像素的小块,对于某些 p x o,这将使每边的块数成为 2 的幂。这将使你的树表现得很好,但代价是在结构中引入了另一个概念。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-08
    • 1970-01-01
    • 1970-01-01
    • 2012-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多