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