conrad的python包装(https://ww5.cs.fau.de/conrad/),一个用于锥束射线照相的框架
pyconrad的Python项目详细描述
康拉德
conrad是一个最先进的软件平台,有大量的文档。它基于独立于平台的技术。特殊库提供对硬件加速的访问,如CUDA和OpenCL。有一个易于并行处理的接口。该软件包包括不同的模拟工具,能够生成4-d投影和体积数据以及相应的矢量运动场。包括著名的重建算法,如fbp、dbp和art。包中的所有算法都引用了一个科学源。有关详细信息,请访问http://conrad.stanford.edu。
安装
通过PIP安装:
pip install pyconrad
或者如果您使用:
pip install -e .
这将自动安装conrad和所有python依赖项。正确运行的需求在3.5版或更新版本的python和java 8中。
如果在安装过程中遇到问题,请查看我们的wiki:https://git5.cs.fau.de/PyConrad/pyCONRAD/wikis/home
测试
如果您想测试PyConrad是否在您的计算机上正常工作,您可以通过以下途径执行本报告中包含的所有测试:
python setup.py test
更改日志
可以找到CHANGELOG.md。
用法
您可以用python启动conrad,如下所示:
importpyconradpyconrad.setup_pyconrad()pyconrad.start_gui()# start ImageJpyconrad.start_reconstruction_pipeline_gui()# if you want to start CONRAD's reconstruction filter pipeline
或者可以从命令行运行conrad重建管道:
conrad
# or: conrad_imagej
imagej命令
初始化jvm后,可以访问imagej和conrad的所有类。
importpyconrad.autoinitimportijfromedu.stanford.rsl.conrad.data.numericimportNumericGridimportnumpyasnppyconrad.start_gui()a=np.random.rand(20,30)grid=NumericGrid.from_numpy(a)grid.show()ij.IJ.run('FFT')
imshow
您还可以使用pyconrad查看imagej中的numpy数组。
importpyconrad.autoinitimportnumpyasnpimporttimea=np.random.rand(20,30)luts=['Fire','Spectrum','Ice','Cyan']forlutinluts:pyconrad.imshow(a,lut,lut=lut)print('Enjoy white noise!')foriinrange(300):noise=np.random.rand(200,200)pyconrad.imshow(noise,'White noise',spacing=(3,2),origin=(0,2))time.sleep(0.01)pyconrad.close_all_windows()
基本示例
您可以通过pyconrad.edu()或使用方便类classgetter访问Conrad的Java类。
importpyconrad.autoinitimportedu.stanford.rsl.tutorial.phantomsfromedu.stanford.rsl.conrad.phantomimportNumericalSheppLogan3Dphantom2d=edu.stanford.rsl.tutorial.phantoms.MickeyMouseGrid2D(100,100)phantom3d=NumericalSheppLogan3D(100,100,100).getNumericalSheppLoganPhantom()# You can also group Java packages an access all classes that are contained (import * does not work)# Access more easily using ClassGetter (# type: pyconrad.AutoCompleteConrad adds static auto-complete feature for ClassGetter.edu)_=pyconrad.ClassGetter('edu.stanford.rsl.tutorial.phantoms','edu.stanford.rsl.conrad.phantom')# type: pyconrad.AutoCompleteConradprint('This is a Java class: '+str(_.NumericalSheppLogan3D))# Shape is for dimensions (z,y,x), size for (x,y,z)print(grid.shape)print(grid.size)# Use Java method of class MickeyMouseGrid2Dphantom2d.show()phantom3d.show()
也可以将内存传输到numpy.ndarray。数值网格有额外的方法from_numpy和as_numpy:
_=pyconrad.ClassGetter()array=np.random.rand(4,2,3).astype(pyconrad.java_float_dtype)grid=_.NumericGrid.from_numpy(array)# Manipulate data in using CONRAD at Position (x,y,z) = (0,1,3)grid.setValue(5.0,[0,1,3])# or easier with Python indices (reversed)grid[3,1,0]=5# Shapeprint(grid.shape)print(grid.size)# Get modified arraynew_array=grid.as_numpy()# Attention: Python has a different indexing (z,y,x)print('Old value: %f'%array[3,1,0])print('New value: %f'%new_array[3,1,0])
更多示例
可以找到更多示例here
自动完成
由于很难记住java函数和类的确切名称,pyconrad为conrad类提供了基本的自动完成功能。 只需给ide一个类型提示,对象表示某个java命名空间或类(# type: pyconrad.AutoCompleteConrad.edu.standford...)。
与PyCharm一起工作:
java类的扩展方法
为了方便java和python之间的转换,我们在python中扩展了一些重要的java类,以便在相应的java类和相应的numpy结构之间进行转换。 扩展了以下Java类:
- 点nd
- 简单驱动器
- 简单矩阵
- 数值网格(因此所有网格1d-网格4d)
使用以下方法:
- 作为numpy(取决于类表示的数组或矩阵)
- 从努比
- 从列表中
- 来自tif
- 保存tif
- 保存vtk
常见问题
# Creating a PointND_.PointND(3,3)# does not work_.PointND([3,3])# this does work_.PointND(JArray(JDouble)([3,2]))# works_.PointND.from_numpy(np.array([2.1,3.1]))#works, uses extension method_.PointND.from_list([2.1,3.1])#works, uses extension method# Getting PointND as numpy arraynumpy_point=java_point.as_numpy()# the same applies for SimpleVector_.SimpleVector([3,2])# does not work. pyconrad does not know whether you want to call SimpleVector(final double... otherBuffer) or public SimpleVector(final float... otherBuffer)_.SimpleVector(JArray(JDouble)([3,2]))# works_.SimpleVector.from_numpy(np.array([2.1,3.1]))#works, uses extension method_.SimpleVector.from_list([2.1,3.1])#works, uses extension method#Getting SimpleVector as numpy arraynumpy_vector=java_vector.as_numpy()#the same applies for SimpleMatrix_.SimpleMatrix(JArray(JDouble,2)([[1.1,2.2,3.3],[4.4,5.5,6.6]]))# works_.SimpleMatrix.from_numpy(np.matrix([[1.1,2.2,3.3],[4.4,5.5,6.6]]))#works, uses extension method_.SimpleMatrix.from_list([[1.1,2.2,3.3],[4.4,5.5,6.6]])#works, uses extension method#Getting SimpleMatrix as numpy matrixnumpy_matrix=java_matrix.as_numpy()# Grid.setOrigin(...), setSpacing_.Grid2D(3,2).setOrigin(JArray(JDouble)([2,3]))# Creating nested enumstraj=_.HelicalTrajectory()print(traj.getDetectorOffsetU())# returns a floatenumval=_.['Projection$CameraAxisDirection'].values()[int(traj.getDetectorOffsetU())]# Convert back to enumenumval=jvm.enumval_from_int('Projection$CameraAxisDirection',traj.getDetectorOffsetU())# or like that