发明名称 一种快速高质量最大密度投影实现方法
摘要 本发明提供一种快速高质量最大密度投影实现方法,其结合现有改进方案,根据光线进入数据块的24种情况,利用八叉树结构对数据块进行递归处理,并利用八叉树最大最小值结构对透明数据块或子节点进行有效地跳过,同时采用并行计算提高CPU利用效率,有效减少运算时间,此外利用单元边界采样,减少数据访问量和计算量。从而大大减少数据的计算,实现实时高质量的最大密度投影。
申请公布号 CN101937575B 申请公布日期 2012.06.06
申请号 CN201010267973.3 申请日期 2010.08.31
申请人 深圳市蓝韵实业有限公司 发明人 丁亮;陈闽峰;吕广志
分类号 G06T15/00(2006.01)I 主分类号 G06T15/00(2006.01)I
代理机构 深圳市百瑞专利商标事务所(普通合伙) 44240 代理人 金辉
主权项 一种快速高质量最大密度投影实现方法,包括以下步骤:A.数据预处理,将数据分块整理存储并建立最大值最小值八叉树;B.光线初始化,根据移动模板的方法快速定位进入点,计算出光线的进入点并根据进入点位置将所有光线分配给其进入的数据块;C.根据光线方向将数据块分组,采用并行计算分别处理每组数据块;D.处理组内每个数据块的所有光线,利用最大值最小值八叉树信息加速光线采样,当光线穿出数据块时,判断其是否已经穿出数据体;若没有穿出数据体,根据采样位置将光线分配给下一个数据块后进入E步骤;E.继续处理下一组数据块;F.所有分组处理完成,其特征在于:所述B步骤中的光线初始化,先利用移动模板的方法得到每条光线的进入深度后,再通过叠加的方法计算得到每条光线的进入点;所述光线进入深度和进入点的计算方法为:三维坐标表示为vector(x,y,z),vector.x、vector.y、vector.z分别表示其X、Y、Z分量,图像大小表示为size(cx,cy),size.cx、size.cy分别表示图像的宽和高,体数据坐标系约定为Voxel坐标系,投影平面空间坐标系约定为View坐标系;体数据到投影平面空间的三维坐标变换为VoxeltoView,投影平面空间到体数据的三维坐标变换为ViewtoVoxel;Voxel坐标vecVoxel与对应的View坐标vecView之间的转换关系 为:vecVoxel=ViewtoVoxel×vecViewvecView=VoxeltoView×vecVoxel投影大小为imagesize,根据VoxeltoView计算数据块在X、Y、Z三个方向的3D View坐标偏移DeltaBX、DeltaBY,DeltaBZ: <mfenced open='{' close=''> <mtable> <mtr> <mtd> <mi>DeltaBX</mi> <mo>=</mo> <mi>VoxeltoView</mi> <mo>&times;</mo> <mi>Voxel</mi> <mrow> <mo>(</mo> <mn>32,0,0</mn> <mo>)</mo> </mrow> <mo>-</mo> <mi>VoxeltoView</mi> <mo>&times;</mo> <mi>Voxel</mi> <mrow> <mo>(</mo> <mn>0,0,0</mn> <mo>)</mo> </mrow> </mtd> </mtr> <mtr> <mtd> <mi>DeltaBY</mi> <mo>=</mo> <mi>VoxeltoView</mi> <mo>&times;</mo> <mi>Voxel</mi> <mrow> <mo>(</mo> <mn>0,32,0</mn> <mo>)</mo> </mrow> <mo>-</mo> <mi>VoxeltoView</mi> <mo>&times;</mo> <mi>Voxel</mi> <mrow> <mo>(</mo> <mn>0,0,0</mn> <mo>)</mo> </mrow> </mtd> </mtr> <mtr> <mtd> <mi>DeltaBZ</mi> <mo>=</mo> <mi>VoxeltoView</mi> <mo>&times;</mo> <mi>Voxel</mi> <mrow> <mo>(</mo> <mn>0,0</mn> <mo>,</mo> <mn>32</mn> <mo>)</mo> </mrow> <mo>-</mo> <mi>VoxeltoView</mi> <mo>&times;</mo> <mi>Voxel</mi> <mrow> <mo>(</mo> <mn>0,0,0</mn> <mo>)</mo> </mrow> </mtd> </mtr> </mtable> </mfenced>当前数据块中心在投影空间中的坐标为CurPos,初始值为(0,0,0),对于顺序为(bx,by,bz)的数据块而言,其对应的Voxel坐标系中位置Pos,Pos为:Pos=CurPos+DeltaBX×bx+DeltaBY×by+DeltaBZ×bzEntryDepth指光线进入深度,即进入点到投影平面的距离,对于该数据块内的第i个光线,其进入深度为:Depth[i]=Pos.z+EntryDepth[i]其中PixelOffset为相对于模板中心的2D坐标偏移值则当前光线其在投影平面上对应的2D坐标索引值,则当前光线其在投影平面上对应的2D坐标索引值为:Index[i]=Pos.x+Pos.y×imagesize.cx+PixelOffset[i]以数据块为单位进行循环,计算出数据块内所有光线的进入深度Depth[i],根据其在投影面上的索引值Index[i]得到投影面上对应的进入深度Depth[index[i]],如果Depth[i]<Depth[index[i]],则将更新Depth[index[i]]的值为Depth[i];得到投影面上所有光线的进入深度后,根据ViewtoVoxel求出光线在X、Y、Z三个方向3D Voxel坐标偏移DeltaX、DeltaY、DeltaZ: <mrow> <mfenced open='{' close=''> <mtable> <mtr> <mtd> <mi>DeltaX</mi> <mo>=</mo> <mi>ViewtoVoxel</mi> <mo>&times;</mo> <mi>View</mi> <mrow> <mo>(</mo> <mn>1,0,0</mn> <mo>)</mo> </mrow> <mo>-</mo> <mi>ViewtoVoxel</mi> <mo>&times;</mo> <mi>View</mi> <mrow> <mo>(</mo> <mn>0,0,0</mn> <mo>)</mo> </mrow> </mtd> </mtr> <mtr> <mtd> <mi>DeltaY</mi> <mo>=</mo> <mi>ViewtoVoxel</mi> <mo>&times;</mo> <mi>View</mi> <mrow> <mo>(</mo> <mn>0,1,0</mn> <mo>)</mo> </mrow> <mo>-</mo> <mi>ViewtoVoxel</mi> <mo>&times;</mo> <mi>View</mi> <mrow> <mo>(</mo> <mn>0,0,0</mn> <mo>)</mo> </mrow> </mtd> </mtr> <mtr> <mtd> <mi>DeltaZ</mi> <mo>=</mo> <mi>ViewtoVoxel</mi> <mo>&times;</mo> <mi>View</mi> <mrow> <mo>(</mo> <mn>0,0,1</mn> <mo>)</mo> </mrow> <mo>-</mo> <mi>ViewtoVoxel</mi> <mo>&times;</mo> <mi>View</mi> <mrow> <mo>(</mo> <mn>0,0,0</mn> <mo>)</mo> </mrow> </mtd> </mtr> </mtable> </mfenced> <mo>,</mo> </mrow>同时求出View(0,0,0)对应的Voxel坐标Pos:Pos=ViewToVoxel×View(0,0,0),则对于投影平面上点(x,y),令其进入深度为depth,其进入点为:voxel=Pos+x×DeltaX+y×DeltaY+depth×DeltaZ,所述A步骤中分成的数据块大小为2n*2n*2n,n为大于1的自然数,数据块小于CPU的缓存容量;所述B步骤的所述移动模板大小为(2n+m)*(2n+m)*(2n+m),其中m为大于等于1的自然数,所述移动模板中心与每个待投影的数据块的中心重叠,所述移动模板记录有模板中光线的数目和模板数据,所述模板数据包括光线相对于模板中心的2D坐标偏移值和光线进入深度;所述n为5,所述m为4,所述数据块大小为32*32*32,所述移动投影模板大小为36*36*36。
地址 518000 广东省深圳市福田区景田北路81号碧景园E栋601