Java 四叉树问题-存储冗余信息

Java 四叉树问题-存储冗余信息,java,image,image-processing,quadtree,decomposition,Java,Image,Image Processing,Quadtree,Decomposition,我有一个不是正方形(m x n维)的图像。此外,其尺寸不与底座2对齐(即m不=2^k&n不=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))); 根据生成的最大尺

我有一个不是正方形(m x n维)的图像。此外,其尺寸不与底座2对齐(即m不=2^k&n不=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
}
问题:


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

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

也许您的树不是以(概念上的)单个像素终止,而是以o像素存储p像素的小块,对于某些pxo,这将使每侧的块数为2的幂。这将使您的树表现良好,而代价是在结构中引入另一个概念。

四叉树通常用于跟踪世界空间中的对象(物理/逻辑)。这与绘制图像(渲染)有什么关系?四叉树在存储具有合理数量的相同颜色区域的图像时非常常见。当在几个像素上有很多不同的颜色时,它们的效果就不好了。你需要同样颜色的更大的方块来获得适当的压缩。你如何“切掉多余的部分”呢?每当代码处理一个完全超出边界的节点时,忽略它,然后移动到下一个节点。您在树上执行什么类型的操作?据我对Java的了解,您将在反序列化的图像上使用getSubimage(x,y,width,height)。如果您将原始图像存储在“较大正方形”的0,0处,那么调用将是:img.getSubimage(0,0,originalWidth,originalHeight)。我需要显示我的代码,但它太大,无法在此处发布。我不是Java专家,但我选择的语言非常相似。关于发布大量代码,我不知道该告诉你什么,但我认为没有必要。上面提到的getSubimage方法是我在搜索“如何在java中裁剪图像”时发现的方法。这就是从数据结构中重新创建映像后需要做的全部工作。使用为原始图像大小存储的额外数据构建一个矩形,用于将图像裁剪回其原始大小;有效地,切断多余的部分。