我读过很多文章,但似乎都没有回答这个问题。或者也许我只是不理解。我正在尝试构建一个四叉树,以便它可以代表一个图像。叶节点用于保持像素,非叶节点将保持其子节点的平均值像素。
我的问题是:
叶子节点只保存像素是如何工作的?为什么其他节点没有像素?我们如何知道细分原始根节点以表示给定图像的次数?我们只是将它细分为n
次,其中n
是高度和宽度(对于正方形)?
编辑 那么如何跟踪叶节点,所以我知道何时在该位置添加像素?现在我有一个辅助功能,为我划分区域,跟踪宽度和高度。
答案 0 :(得分:5)
四叉树最适用于尺寸为2的幂的方形图像(例如,大多数纹理)。您不应该将每个节点视为代表“像素”。相反,将其视为表示“大小为2 ^ k的像素的正方形块”。在最终叶子的情况下,k是0,因此每个叶子节点表示大小为1的正方形像素块,即单个像素。树中的内部节点表示越来越大的图像部分。
答案 1 :(得分:1)
为什么只有叶节点保持像素?问问自己一个非叶子节点是否有一个像素,那么它的孩子会持有什么?由于你不能细分一个像素,答案显然是什么 - 没有这样的节点。
我们如何知道要细分多少次?当然,有多种方法可以做到,这取决于你构建四叉树的原因。一般来说,具有更多熵的图像区域 - 更多“细节” - 应该被细分得更多,而较低熵,“更平坦”的区域可以被更少地划分。有许多不同的算法可供选择何时何地细分。通常,它们比较区域内的像素值,并在差异高于某个阈值时进行分割。
答案 2 :(得分:0)
叶子节点如何工作? 只持有像素?为什么不这样做 节点保持像素?
这取决于您使用Quadtree的内容。您可以将任何类型的信息链接到其他节点,例如。指向此节点描述的矩形的左上角和宽度/高度的指针,但在大多数情况下您不需要它(或者需要像您可以预先计算的平均值以加快速度)。
我们怎么知道多少次 将原始根节点细分为 代表给定的图像?
对于每个细分,您都是区域宽度和高度的一半,因此对于大小为n
的方形图像,您需要细分log2(n)
次,以获得非正方形图像的大小n*m
您最多需要max(log2(n), log2(m))
步。
答案 3 :(得分:0)
我认为回答问题的最佳方法是回答两个你没有问过的问题。
四叉树是二维的二叉树。这就是每个非叶节点有(最多)四个孩子的原因。这允许您将索引应用于平面,就像数据库使用二叉树或其某些变体来索引单个维度一样,具有相同的非常有利的稀疏相空间表示属性。
将此应用于图像压缩和逐行显示是非常明显的:如果您进行限制为n深度的树木漫步,那么您将获得跨越整个图像空间的4 ^ n项图片信息。如果你更深一层,每个像素分成四个。如果我没记错的话,JPEG2000就是这样的。我说“图片信息项”因为它们不需要是单个位;项目可以是32位ARGB或描述该点空间的任何其他属性(或属性)。