图像学相关的数据结构:多维范围查找,四叉树,BSP树

[size=large]Multidimensional Range Search(多维范围查找):[/size]
1.这是一个静态搜索树结构,建立后只支持查找操作,用于查询条件有N个且没有优先级的情况。
2.k-dimension range trees (k维范围搜索树)的每个节点node含有一棵k-1维范围搜索树,该k-1维范围搜索树包含了node其子结点中k-1维树的所有记录,根据第k维数据(即不记录在(k-1)维树里的数据)对半分为左右孩子,递归地拆分直到节点的数据长度足够小。特别地,k=1时是一个已排序的一维数组;因此k=2时,每个节点中包含的是一个数组而不是一棵树,即树中每个节点含有一个一维数组。
3.[table]
|k Dimension|Processing Time P(n,k)|Space S(n,k)|Query Time Q(n,k)
|1|O(n log n)|O(n)|O(log n +s)
|2|O(n log n)|O(n log n)|O((log n)^2 +s)
|3|O(n (log n)^2)|O(n (log n)^2)|O((log n)^3 +s)
|k|O(n (log n)^(k-1)), where k>1|O(n (log n)^(k-1))|O(n (log n)^k +s)
[/table]
从P(n,1)到P(n,2)复杂度没有增加是因为,一维数组在子结点中被拆分不需要重新计算,总排序时间依然是O(n log n);而树的每一层寻找median中间拆分点的时间是O(n),有O(log n)层。所以总时间是O(n log n + n×log n)=O(n log n).
维数k增大时复杂度增加log n均是因为在k-1维的复杂度上,建立层数为log n的新树。Q(n,k)中的s是在查询范围内的总记录数,需要循环输出结果,故复杂度为O(s)。


[size=large]四叉树(Quad Trees):[/size]
1.四叉树每个节点用于表示一个二进制图片的一部分,内结点有四个子结点,从横纵向将内结点所表示的部分图片平分。根节点表示整个2^k × 2^k的图片,其中k为高。
2.假设:二进制图片的每个像素用0或1表示,0为黑色1为白色。因此我们可以在四叉树中用灰色结点表示该区域既有黑色像素又有白色像素,灰色结点均是内结点,而全是白色或全是黑色的区域便可以用一个单一的白色或黑色结点表示,从而节省空间。
3.用这个数据结构,便可以对图片方便地进行一些操作和处理。例如,将图片旋转90度,只需将树中所有孩子结点的顺序进行调整;缩小一张图片到原来的一半,只需将倒数第二层(L-1)的每个灰色结点极其孩子根据合理的规则合成一个黑色或白色结点。
4.若将子结点数目从4增加到8,便可以用类似方法来表示三维图片,该树叫做Oct Tree(八叉树)。


[size=large]Binary space partitioning trees(BSP树):[/size]
1.BSP树的建立是通过选择切分的单元(线或平面,hyperplanes),判断每个图形在切分单元的左边或右边,从而生成左右子树,并递归地用相同方式切分左右子树,直到每个叶子结点足够小容易被绘画。
2.BSP树是用于多个物体相互遮挡的图像绘制中,将图像分析切分成可以被绘画的对象,并生成位置关系,从而使视角的控制更容易。
3.根据切分单元ph的公式ax + by + c = 0或ax + by + cz + d = 0,可以计算出目标对象的位置,从而生成左子树(小于0)和右子树(大于0)。
伪代码

BSPtree(O)
// O is object set
if O is empty, return null;
Create a new node N;
N.ph = partitioning hyperplane for O;
lList = rList = N.cList = null;
for each object z in O do
if z is coincident to ph or |O| = 1, add z to N.cList;
if z is left of ph, add z to lList;
if z is right of ph, add z to rList;
if z spans ph, split z and add pieces to lList and rList;
N.leftChild = BSPTree(lList);
N.rightChild = BSPTree(rList);
return N;

draw(N)
//Basic Draw Back to Front
if eye left of N.ph
{draw(N.rightChild); draw N.cList; draw(N.leftChild)};
else if eye right of N.ph
{draw(N.leftChild); draw N.cList; draw(N.rightChild)};
else // eye coincident to N.ph
{draw(N.leftChild); draw(N.rightChild)};

draw(N)
//Basic Draw Front to Back
if eye left of N.ph
{draw(N.leftChild); draw N.cList; draw(N.rightChild)};
else if eye right of N.ph
{draw(N.rightChild); draw N.cList; draw(N.leftChild)};
else // eye coincident to N.ph
{draw(N.rightChild); draw(N.leftChild)};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值