IDL立体数据投影函数-PROJECT_VOL

文章详细介绍了IDL中的PROJECT_VOL函数,用于将三维体数据投影到二维平面并考虑深度、不透明度等因素。它使用4x4转换矩阵支持各种投影,包括透视。文中还提到VOXEL_PROJ的效率优势和示例程序演示了如何应用该函数,以及其参数的使用方法和效果。
摘要由CSDN通过智能技术生成

        The PROJECT_VOL函数返回三维体数据投影到二维平面形成的图像(类似于X射线)。返回的图像为体数据的半透明影像(体数据中的数值越大返回的图像对应的点越亮)。深度参数和不透明度都会影响图像。体数据投影用到了4x4的转换矩阵,因此,包括透视投影在内的任何投影均可使用。一般情况下,系统使用的视图转换矩阵(!P.T)即为4x4的矩阵。

注意:

        VOXEL_PROJ过程实现了与此类似的大部分功能,但速度更快。

        这个程序是由IDL语言写的,因此,在IDL的发布库中可以找到project_vol.pro 文件,其中包含了本程序的源代码。

调用方法:

Result = PROJECT_VOL( Vol, X_Sample, Y_Sample, Z_Sample [, /AVG_INTENSITY] [, /CUBIC] [, DEPTH_Q=value] [, OPAQUE=3D_array] [, TRANS=array] [, XSIZE=longword integer] [, YSIZE=longword integer] [, /Z_BUFFER] )

返回值:

        返回三维数据在二维平面上的投影。

参数:

Vol

        一个三维数据,可以是任何数据类型,但不能是字符串或结构体类型,其中包含了用于投影的数据。

X_Sample

        一个长整型数值,用于指定沿X方向上的射线数(即图像X方向上的分辨率)。返回的图像分辨率将为[X_sample, Y_sample]。

Y_Sample

        一个长整型数值,用于指定沿X方向上的射线数(即图像Y方向上的分辨率)。返回的图像分辨率将为[X_sample, Y_sample]。为了保证正常的纵横比,Y_sample应该与X_sample相等。

Z_Sample

        沿射线方向上的采样数。X_sample, Y_sample和 Z_sample值越高,图像的分辨率越好,同时执行时间也就越长。

关键字:

AVG_INTENSITY

        如果设置该关键字用于指定亮度计算时取平均值。默认情况下是最亮度最大值。如果设置了Z_BUFFER关键字则忽略该该关键字。

CUBIC

        如果设置该关键字则使用三次插值方法。默认采用双线性插值算法。

DEPTH_Q

       设置该关键字表示创建图像时要用到深度对比。该关键字是一个浮点数,介于0.0和1.0之间。该值定义为体数据中最远区域与最近区域的亮度之比。该值为0则表示体数据的背面绘制为黑色,而1.0则表示背面和前面的亮度一样。默认值为1.0 。

OPAQUE

        一个三维数组,可以为除字符串和结构体之外的任意类型,大小和维数与Vol一致。这个数组指定每一个体元的不透明度。OPAQUE值为0表示透明。OPAQUE的值是累加的。例如,  如果一条值为50的数据点发出了射线,然后穿过了10半透明的单元格(每一个单元格的值为0,而不透明度值为5),那么射线则完全被遮挡(即返回的图像上将看不到值为50的点)。默认值是全透明的。

TRANS

        一个4x4浮点数组,用于投影体数据时作为转换矩阵使用。默认是使用系统视图矩阵 (!P.T)。

XSIZE

        返回图像的X尺寸。最后会使用CONGRID使图像变成XSIZE ×YSIZE。默认为当前窗口的X尺寸 (或才Z缓冲区的X尺寸)。如果当前窗口不存在,则默认使用X_sample值。

YSIZE

        返回图像的Y尺寸。最后会使用CONGRID使图像变成XSIZE ×YSIZE。默认为当前窗口的Y尺寸 (或才Z缓冲区的Y尺寸)。如果当前窗口不存在,则默认使用Y_sample值。

Z_BUFFER

        如果设置该关键字,则投影将会与当前Z缓冲区的内容进行合并。默认是不使用Z缓冲区的内容。

示例程序:

pro PROJECT_VOL_DEMO

device, decomposed = 0

loadct,33

; 加载数据:

RESTORE, FILEPATH('clouds3d.dat', SUBDIR=['examples','data'])

sz = size(clouds)

vx = sz[1] & vy = sz[2] & vz = sz[3]

    ; 使数值为0的数据取一小值,以显示出立方体的轮廓:

vol = BYTSCL(rain)

vol(where(vol le 5)) = 5

opaque = BYTSCL(rain)

opaque(where(opaque le 5)) = 5

WINDOW, 0, XSIZE=512, YSIZE=512

; 带不透明度参数:

for i = 20, 130, 2 do begin

; 建立视图:

CREATE_VIEW, ax = i, az = 20, xmin = 0, xmax = 55, $

ymin = 0, ymax = 55, zmin = 0, zmax = 32

; 产生并显示图像:

img = PROJECT_VOL(vol, 55, 55, 32, DEPTH_Q=1.0, $

  OPAQUE=opaque)

TVSCL, img

endfor

; 全透明:

for i = 20, 130, 2 do begin

T3D, /RESET

T3D, TRANSLATE=[-0.5, -0.5, -0.5]

T3D, SCALE=[0.7, 0.7, 0.7]

T3D, ROTATE=[20, i, 20]

T3D, TRANSLATE=[0.5, 0.5, 0.5]

; 产生并显示图像:

img = PROJECT_VOL(vol, 55, 55, 32, DEPTH_Q=1.0, $

  TRANS=(!P.T))

TVSCL, img

endfor

END

图1 示例程序截图

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值