The catalog: 73 algorithms¶
| Module | Methods | Input |
|---|---|---|
point_cloud_processing |
voxel_downsample, statistical_outlier_removal, radius_outlier_removal, mesh_to_pointcloud | .ply, .pcd, .txt, .xyz |
mesh_processing |
subdivision, simplification, mesh_to_pcd_uniform, mesh_to_pcd_poisson_disk | .ply, .obj, .stl, .off |
voxel_to_mesh |
voxelization, binary_erosion | .ply, .obj, .stl, .off |
sdf |
compute_sdf, occupancy_reconstruction, sdf_voxel_visualization | .ply, .obj, .stl, .off |
point_cloud_reconstruction |
poisson, convex_hull, alpha_shape, ball_pivoting | .ply, .pcd, .txt, .xyz |
registration |
ransac_global, icp_refinement, ransac_icp_pipeline | .ply, .pcd, .txt, .xyz |
deformable_registration |
cpd_deformable, gaussian_deformation | .ply, .pcd, .txt, .xyz |
point_cloud_segmentation |
ransac_plane, dbscan_clustering | .ply, .pcd, .txt, .xyz |
stereo_3d_reconstruction |
depth_colorization, depth_filter | .ply, .pcd, .txt, .xyz |
lidar_scene_detection |
height_colorization, ground_removal, object_clustering | .ply, .pcd, .txt, .xyz, .las |
lidar_camera_fusion |
intensity_colorization, roi_extraction, multi_resolution | .ply, .pcd, .txt, .xyz, .las |
features_extraction |
normal_estimation, fpfh_features, curvature_estimation | .ply, .pcd, .txt, .xyz |
collision_detection |
sdf_collision, penetration_depth | .ply, .obj, .stl, .off |
pyvista_mesh_processing |
pv_decimate, pv_subdivide, pv_smooth_laplacian, pv_smooth_taubin, pv_clean, pv_fill_holes, pv_compute_normals, pv_triangulate, pv_extract_surface | .ply, .obj, .stl, .vtk, .vtu |
pyvista_pointcloud_processing |
pv_threshold, pv_clip_plane, pv_clip_box, pv_random_sample, pv_extract_points | .ply, .pcd, .vtk, .vtu, .obj, .stl |
pyvista_volume_processing |
pv_contour, pv_slice, pv_slice_orthogonal, pv_threshold_volume, pv_extract_geometry, pv_extract_cells | .vti, .vtk, .vtu, .ply, .obj, .stl |
pyvista_analysis |
pv_curvature, pv_distance, pv_glyph, pv_vector_magnitude, pv_scalar_stats, pv_extract_feature_edges | .ply, .obj, .stl, .vtk, .vtu |
simpleitk_registration |
rigid, advanced_rigid, affine, bspline, demons, difference_analysis | .vti, .mha, .nrrd, .nii, .dcm |
simpleitk_segmentation |
otsu_threshold, manual_threshold, connected_components, watershed | .vti, .mha, .nrrd, .nii |
Registration methods take two inputs: input is the fixed reference, moving
is the one that gets transformed. They write the estimated transform next to
the output as <output>.json (obj.transform).
pl.catalog().describe("simpleitk_registration.rigid") prints every parameter.
The theory behind each module (with the formulas) is in the catalog too:
pl.catalog().module("sdf").theory.
What pardesline gives you, call by call¶
pl.load(path) |
A local file as a typed Object: PointCloud, Mesh, Volume, LabelMap, Transform, Image. Volumes get their frame (LPS, mm, affine) from the header; glTF is Y-up metres by specification; formats that carry no unit stay unknown until you say. |
pl.load(dataset) |
A Dataset from one of the 43 bundled manifests (pardesline datasets), from hf://org/name[/folder], s3://bucket/prefix, tcia://Collection, from your own manifest file, or from a folder via pl.scan. Files are fetched on first access (per file from the Hub or a bucket, member by member out of remote archives, series by series from TCIA, SHA-512-verified downloads), cached. |
pl.load("sweep.bin", layout=...) |
A raw .npy / .npz / .bin array as a PointCloud or a grid, through a declared layout (dtype, shape, columns, key). Never guessed; materialised once as PLY / MetaImage so every algorithm runs on it. |
ds.export(folder) |
A standard copy of any dataset: PLY / MetaImage / NIfTI files, one .pardesline.json sidecar each (frame, units, labels, licence, provenance) and a local manifest. |
obj.run("module.method", **params) |
Any algorithm; the result is a new Object that keeps the frame and licence and records the step. Aliases: downsample, remove_outliers, normals, poisson, ball_pivoting, decimate, smooth, to_points, icp, ransac, register, segment. |
| Conversions named after the job | Volume.segment() -> LabelMap; LabelMap.to_mesh(label) exact boundary in world coordinates; Volume.to_mesh(isovalue); Mesh.to_points(); PointCloud.to_mesh() (Poisson, lossy); PointCloud.align(moving), Volume.align(moving); clean(). |
pl.run(module, method, input, **params) |
The same without the object wrapper. Returns output path, sidecar JSON, log and timing. |
pl.catalog() |
Every module, method and parameter with type, default, range, choices and description. pl.describe("point_cloud_reconstruction.poisson"). |
obj.to_open3d() / to_pyvista() / to_sitk() / to_numpy() |
Hand the result to the library you already use. pl.o3d, pl.pv, pl.sitk are the real libraries when installed. |
pardesline CLI |
pardesline list, pardesline describe ..., pardesline run module.method in.ply -o out.ply --voxel_size 0.02, pardesline datasets, pardesline fetch amos22 --take 2, pardesline export msd_task02_heart ./heart --take 2. |
pardesline.medical |
Volume I/O (NIfTI, NRRD, MHA, VTI, DICOM series), rigid / affine / B-spline / demons registration, thresholding, watershed, connected components. |
pardesline.cloud |
The hosted platform: upload, share in one line, run on GPU, open the browser viewers. Optional, needs an account. |
Every algorithm is also a plain command with the same contract the platform uses:
python -m pardesline.ops.point_cloud_processing.voxel_downsample --input scan.ply --output small.ply --voxel_size 0.02
Parameters are checked before anything runs — unknown names, wrong types, out-of-range values and missing second inputs fail with a message that lists what is accepted:
ParameterError: point_cloud_processing.voxel_downsample: unknown parameter(s) voxel.
Did you mean: voxel -> voxel_size?. Accepted: voxel_size.
Examples¶
Clean a LiDAR sweep and cluster the objects
sweep = pl.load("sweep.las").with_frame("sensor", "m")
objects = sweep.run("ground_removal").run("object_clustering", eps=0.7, min_points=10)
objects.to_open3d()
Register two CT volumes and check the result
ct_day0 = pl.load("day0.nii") # LPS, mm, affine from the header
ct_day7 = pl.load("day7.nii")
reg = ct_day0.align(ct_day7, metric="mattes_mutual_information", num_iterations=300)
print(reg.transform["rotation_deg"], reg.transform["translation_mm"])
diff = ct_day0.run("difference_analysis", moving=reg)
Segmentation to a printable surface
mask = pl.load("ct.mha").segment(lower=200, upper=600)
bone = mask.to_mesh(label=1).decimate(target_reduction=0.8)
bone.save("bone.stl") # + bone.stl.pardesline.json: LPS mm, licence, every step
Follow a long run
res = pl.run(
"simpleitk_registration",
"bspline",
"a.mha",
moving="b.mha",
on_progress=lambda pct: print(f"{pct}%"),
on_log=print,
timeout=1800,
)