IBSI 2 Phase 2 Compliance: Radiomic Features
Overview
IBSI 2 Phase 2 focuses on evaluating the reproducibility of radiomic features extracted from filtered images. In this phase, specific filters (Mean, LoG, Laws, Gabor, Wavelets) are applied to a digital phantom (Lung Cancer CT), and intensity features are extracted from the resulting response maps.
This page documents Pictologics' compliance with IBSI 2 Phase 2 (Configuration B), which covers 3D volumetric processing.
How to Run the Benchmarks
1. Download the Data
The IBSI 2 reference datasets are available on the IBSI GitHub repository.
- CT Phantom: Download the
PAT1_CT.nii.gzandPAT1_GTV.nii.gz(or similarly namedimage.nii.gz/mask.nii.gz) from theibsi_2_phase_2(oribsi_2_validation) folder.
Place these files in a local directory (e.g., data/ibsi2/data/ct_phantom/) to run the benchmarks.
2. Run Configurations Programmatically using RadiomicsPipeline
You can verify any IBSI 2 configuration programmatically using the RadiomicsPipeline.
from pictologics import RadiomicsPipeline
# Path to your downloaded phantom
image_path = "data/ibsi2/data/ct_phantom/image.nii.gz"
mask_path = "data/ibsi2/data/ct_phantom/mask.nii.gz"
pipeline = RadiomicsPipeline()
# Define common IBSI 2 Preprocessing (Config B)
preprocess_steps = [
# 1. Resample to 1x1x1 mm using Tricubic Spline interpolation
{"step": "resample", "params": {
"new_spacing": (1.0, 1.0, 1.0),
"interpolation": "cubic",
"mask_interpolation": "linear",
"mask_threshold": 0.5
}},
# 2. Round intensities to nearest integer
{"step": "round_intensities", "params": {}},
# 3. Resegment range [-1000, 400] HU
{"step": "resegment", "params": {"range_min": -1000, "range_max": 400}},
]
# Define a filter configuration (e.g., Test 3.B: LoG)
log_config = preprocess_steps + [
{"step": "filter", "params": {
"type": "log",
"sigma_mm": 1.5,
"truncate": 4.0
}},
{"step": "extract_features", "params": {"families": ["intensity"]}}
]
pipeline.add_config("ibsi2_test_3b", log_config)
# Run pipeline
results = pipeline.run(image_path, mask_path, config_names=["ibsi2_test_3b"])
print(results["ibsi2_test_3b"])
Phase 2 Results
Summary: 9/9 Tests Passed (3D Configuration). Total Features: 161/161 passed.
Test 1.B: None
Configuration: Baseline (no filter)
| Feature | Code | Calc | Ref | Tol | Status |
|---|---|---|---|---|---|
| Mean | stat_mean | -46.4 | -46.4 | 5.9 | ✅ PASS |
| Variance | stat_var | 5.26e+04 | 5.26e+04 | 2.8e+03 | ✅ PASS |
| Skewness | stat_skew | -2.18 | -2.18 | 0.09 | ✅ PASS |
| (Excess) kurtosis | stat_kurt | 3.71 | 3.71 | 0.47 | ✅ PASS |
| Median | stat_median | 41 | 41 | 0.7 | ✅ PASS |
| Minimum | stat_min | -997 | -997 | 3 | ✅ PASS |
| 10th percentile | stat_p10 | -427 | -427 | 29 | ✅ PASS |
| 90th percentile | stat_p90 | 92 | 92 | 0.1 | ✅ PASS |
| Maximum | stat_max | 377 | 377 | 15 | ✅ PASS |
| Interquartile range | stat_iqr | 67 | 67 | 9.1 | ✅ PASS |
| Range | stat_range | 1.37e+03 | 1.37e+03 | 20 | ✅ PASS |
| Mean absolute deviation | stat_mad | 159 | 159 | 7 | ✅ PASS |
| Robust mean absolute deviation | stat_rmad | 63.6 | 63.6 | 7.3 | ✅ PASS |
| Median absolute deviation | stat_medad | 121 | 121 | 6 | ✅ PASS |
| Coefficient of variation | stat_cov | -4.94 | -4.94 | 0.64 | ✅ PASS |
| Quartile coefficient of dispersion | stat_qcod | 0.944 | 0.944 | 0.925 | ✅ PASS |
| Energy | stat_energy | 1.96e+10 | 1.96e+10 | 1.9e+09 | ✅ PASS |
| Root mean square | stat_rms | 234 | 234 | 7 | ✅ PASS |
Test 2.B: Mean
Configuration: 3D, support=5
| Feature | Code | Calc | Ref | Tol | Status |
|---|---|---|---|---|---|
| Mean | stat_mean | -49.9 | -49.9 | 5.7 | ✅ PASS |
| Variance | stat_var | 4.44e+04 | 4.44e+04 | 2.3e+03 | ✅ PASS |
| Skewness | stat_skew | -2.13 | -2.13 | 0.09 | ✅ PASS |
| (Excess) kurtosis | stat_kurt | 3.59 | 3.59 | 0.46 | ✅ PASS |
| Median | stat_median | 37.3 | 37.3 | 0.6 | ✅ PASS |
| Minimum | stat_min | -906 | -906 | 5 | ✅ PASS |
| 10th percentile | stat_p10 | -389 | -389 | 25 | ✅ PASS |
| 90th percentile | stat_p90 | 77.2 | 77.2 | 0.1 | ✅ PASS |
| Maximum | stat_max | 316 | 316 | 7 | ✅ PASS |
| Interquartile range | stat_iqr | 92.6 | 92.6 | 13.5 | ✅ PASS |
| Range | stat_range | 1.22e+03 | 1.22e+03 | 10 | ✅ PASS |
| Mean absolute deviation | stat_mad | 149 | 149 | 6 | ✅ PASS |
| Robust mean absolute deviation | stat_rmad | 68.1 | 68.1 | 6.9 | ✅ PASS |
| Median absolute deviation | stat_medad | 114 | 114 | 5 | ✅ PASS |
| Coefficient of variation | stat_cov | -4.22 | -4.22 | 0.47 | ✅ PASS |
| Quartile coefficient of dispersion | stat_qcod | 2.97 | 2.97 | 0.58 | ✅ PASS |
| Energy | stat_energy | 1.68e+10 | 1.68e+10 | 1.6e+09 | ✅ PASS |
| Root mean square | stat_rms | 217 | 217 | 7 | ✅ PASS |
Test 3.B: LoG
Configuration: σ=1.5mm, truncate=4σ
| Feature | Code | Calc | Ref | Tol | Status |
|---|---|---|---|---|---|
| Mean | stat_mean | -2.92 | -2.94 | 0.2 | ✅ PASS |
| Variance | stat_var | 720 | 720 | 33 | ✅ PASS |
| Skewness | stat_skew | 0.428 | 0.428 | 0.009 | ✅ PASS |
| (Excess) kurtosis | stat_kurt | 6.13 | 6.13 | 0.27 | ✅ PASS |
| Median | stat_median | -0.927 | -0.919 | 0.024 | ✅ PASS |
| Minimum | stat_min | -173 | -173 | 5 | ✅ PASS |
| 10th percentile | stat_p10 | -32.1 | -32.2 | 0.5 | ✅ PASS |
| 90th percentile | stat_p90 | 17.5 | 17.4 | 1.9 | ✅ PASS |
| Maximum | stat_max | 204 | 204 | 1 | ✅ PASS |
| Interquartile range | stat_iqr | 11.4 | 11.4 | 0.3 | ✅ PASS |
| Range | stat_range | 377 | 377 | 5 | ✅ PASS |
| Mean absolute deviation | stat_mad | 15.5 | 15.5 | 0.4 | ✅ PASS |
| Robust mean absolute deviation | stat_rmad | 6.36 | 6.37 | 0.19 | ✅ PASS |
| Median absolute deviation | stat_medad | 15.3 | 15.3 | 0.4 | ✅ PASS |
| Coefficient of variation | stat_cov | -9.18 | -9.12 | 1.63 | ✅ PASS |
| Quartile coefficient of dispersion | stat_qcod | -2.34 | -2.34 | 0.07 | ✅ PASS |
| Energy | stat_energy | 2.61e+08 | 2.61e+08 | 1.9e+07 | ✅ PASS |
| Root mean square | stat_rms | 27 | 27 | 0.6 | ✅ PASS |
Test 4.B: Laws
Configuration: L5E5E5, rot-inv max, energy δ=7
| Feature | Code | Calc | Ref | Tol | Status |
|---|---|---|---|---|---|
| Mean | stat_mean | 142 | 142 | 3 | ✅ PASS |
| Variance | stat_var | 1.11e+04 | 1.11e+04 | 300 | ✅ PASS |
| Skewness | stat_skew | 0.645 | 0.645 | 0.028 | ✅ PASS |
| (Excess) kurtosis | stat_kurt | -0.711 | -0.711 | 0.044 | ✅ PASS |
| Median | stat_median | 113 | 113 | 4 | ✅ PASS |
| Minimum | stat_min | 28.5 | 28.5 | 0.1 | ✅ PASS |
| 10th percentile | stat_p10 | 35.6 | 35.6 | 0.1 | ✅ PASS |
| 90th percentile | stat_p90 | 293 | 293 | 4 | ✅ PASS |
| Maximum | stat_max | 525 | 525 | 1 | ✅ PASS |
| Interquartile range | stat_iqr | 188 | 188 | 4 | ✅ PASS |
| Range | stat_range | 496 | 496 | 1 | ✅ PASS |
| Mean absolute deviation | stat_mad | 92.4 | 92.4 | 1.4 | ✅ PASS |
| Robust mean absolute deviation | stat_rmad | 75.9 | 75.9 | 1.4 | ✅ PASS |
| Median absolute deviation | stat_medad | 90.8 | 90.8 | 1.6 | ✅ PASS |
| Coefficient of variation | stat_cov | 0.743 | 0.743 | 0.005 | ✅ PASS |
| Quartile coefficient of dispersion | stat_qcod | 0.699 | 0.699 | 0.003 | ✅ PASS |
| Energy | stat_energy | 1.12e+10 | 1.12e+10 | 7e+08 | ✅ PASS |
| Root mean square | stat_rms | 177 | 177 | 3 | ✅ PASS |
Test 5.B: Gabor
Configuration: σ=5mm, λ=2mm, γ=1.5, rot-inv avg
| Feature | Code | Calc | Ref | Tol | Status |
|---|---|---|---|---|---|
| Mean | stat_mean | 40.2 | 40.2 | 0.2 | ✅ PASS |
| Variance | stat_var | 231 | 231 | 2 | ✅ PASS |
| Skewness | stat_skew | 1.57 | 1.57 | 0.03 | ✅ PASS |
| (Excess) kurtosis | stat_kurt | 4.34 | 4.34 | 0.2 | ✅ PASS |
| Median | stat_median | 37.2 | 37.2 | 0.1 | ✅ PASS |
| Minimum | stat_min | 9.53 | 9.53 | 0.11 | ✅ PASS |
| 10th percentile | stat_p10 | 24.6 | 24.6 | 0.1 | ✅ PASS |
| 90th percentile | stat_p90 | 59.3 | 59.3 | 0.3 | ✅ PASS |
| Maximum | stat_max | 175 | 175 | 3 | ✅ PASS |
| Interquartile range | stat_iqr | 17.4 | 17.4 | 0.1 | ✅ PASS |
| Range | stat_range | 165 | 165 | 3 | ✅ PASS |
| Mean absolute deviation | stat_mad | 11.3 | 11.3 | 0.1 | ✅ PASS |
| Robust mean absolute deviation | stat_rmad | 7.31 | 7.31 | 0.06 | ✅ PASS |
| Median absolute deviation | stat_medad | 11 | 11 | 0.1 | ✅ PASS |
| Coefficient of variation | stat_cov | 0.377 | 0.377 | 0.004 | ✅ PASS |
| Quartile coefficient of dispersion | stat_qcod | 0.226 | 0.226 | 0.002 | ✅ PASS |
| Energy | stat_energy | 6.62e+08 | 6.62e+08 | 9e+06 | ✅ PASS |
| Root mean square | stat_rms | 43 | 43 | 0.2 | ✅ PASS |
Test 6.B: Daubechies 3
Configuration: LLH level 1, rot-inv avg
| Feature | Code | Calc | Ref | Tol | Status |
|---|---|---|---|---|---|
| Mean | stat_mean | -0.182 | -0.182 | 0.024 | ✅ PASS |
| Variance | stat_var | 250 | 250 | 9 | ✅ PASS |
| Skewness | stat_skew | 0.157 | 0.157 | 0.018 | ✅ PASS |
| (Excess) kurtosis | stat_kurt | 8.98 | 8.98 | 0.35 | ✅ PASS |
| Median | stat_median | 0.0576 | 0.0575 | 0.0046 | ✅ PASS |
| Minimum | stat_min | -148 | -148 | 1 | ✅ PASS |
| 10th percentile | stat_p10 | -13.8 | -13.8 | 0.5 | ✅ PASS |
| 90th percentile | stat_p90 | 12.1 | 12.1 | 0.4 | ✅ PASS |
| Maximum | stat_max | 155 | 155 | 1 | ✅ PASS |
| Interquartile range | stat_iqr | 9.35 | 9.35 | 0.15 | ✅ PASS |
| Range | stat_range | 303 | 303 | 2 | ✅ PASS |
| Mean absolute deviation | stat_mad | 9.26 | 9.26 | 0.22 | ✅ PASS |
| Robust mean absolute deviation | stat_rmad | 4.21 | 4.21 | 0.09 | ✅ PASS |
| Median absolute deviation | stat_medad | 9.25 | 9.25 | 0.22 | ✅ PASS |
| Coefficient of variation | stat_cov | -86.9 | -86.9 | 32.6 | ✅ PASS |
| Quartile coefficient of dispersion | stat_qcod | -162 | -162 | 27 | ✅ PASS |
| Energy | stat_energy | 8.96e+07 | 8.96e+07 | 5.3e+06 | ✅ PASS |
| Root mean square | stat_rms | 15.8 | 15.8 | 0.3 | ✅ PASS |
Test 7.B: Daubechies 3
Configuration: HHH level 2, rot-inv avg
| Feature | Code | Calc | Ref | Tol | Status |
|---|---|---|---|---|---|
| Mean | stat_mean | -0.0406 | -0.0406 | 0.0051 | ✅ PASS |
| Variance | stat_var | 422 | 422 | 11 | ✅ PASS |
| Skewness | stat_skew | -0.0112 | -0.0112 | 0.0027 | ✅ PASS |
| (Excess) kurtosis | stat_kurt | 5.45 | 5.45 | 0.09 | ✅ PASS |
| Median | stat_median | -0.0164 | -0.0164 | 0.0013 | ✅ PASS |
| Minimum | stat_min | -203 | -203 | 3 | ✅ PASS |
| 10th percentile | stat_p10 | -20.6 | -20.6 | 0.4 | ✅ PASS |
| 90th percentile | stat_p90 | 20.4 | 20.4 | 0.4 | ✅ PASS |
| Maximum | stat_max | 201 | 201 | 4 | ✅ PASS |
| Interquartile range | stat_iqr | 16.3 | 16.3 | 0.2 | ✅ PASS |
| Range | stat_range | 404 | 404 | 7 | ✅ PASS |
| Mean absolute deviation | stat_mad | 13.4 | 13.4 | 0.2 | ✅ PASS |
| Robust mean absolute deviation | stat_rmad | 7.2 | 7.2 | 0.1 | ✅ PASS |
| Median absolute deviation | stat_medad | 13.4 | 13.4 | 0.2 | ✅ PASS |
| Coefficient of variation | stat_cov | -506 | -506 | 149 | ✅ PASS |
| Quartile coefficient of dispersion | stat_qcod | -684 | -684 | 130 | ✅ PASS |
| Energy | stat_energy | 1.51e+08 | 1.51e+08 | 7e+06 | ✅ PASS |
| Root mean square | stat_rms | 20.6 | 20.6 | 0.3 | ✅ PASS |
Test 8.B: Simoncelli
Configuration: B map level 1
| Feature | Code | Calc | Ref | Tol | Status |
|---|---|---|---|---|---|
| Mean | stat_mean | 0.32 | 0.32 | 0.059 | ✅ PASS |
| Variance | stat_var | 1.81e+03 | 1.81e+03 | 70 | ✅ PASS |
| Skewness | stat_skew | -0.0719 | -0.0719 | 0.0163 | ✅ PASS |
| (Excess) kurtosis | stat_kurt | 7.64 | 7.64 | 0.33 | ✅ PASS |
| Median | stat_median | -0.00194 | -0.00947 | 0.0107 | ✅ PASS |
| Minimum | stat_min | -411 | -411 | 5 | ✅ PASS |
| 10th percentile | stat_p10 | -36.6 | -36.5 | 1.3 | ✅ PASS |
| 90th percentile | stat_p90 | 38.1 | 38.1 | 1.3 | ✅ PASS |
| Maximum | stat_max | 374 | 374 | 3 | ✅ PASS |
| Interquartile range | stat_iqr | 25.5 | 25.5 | 0.4 | ✅ PASS |
| Range | stat_range | 785 | 785 | 6 | ✅ PASS |
| Mean absolute deviation | stat_mad | 25.3 | 25.3 | 0.6 | ✅ PASS |
| Robust mean absolute deviation | stat_rmad | 11.7 | 11.7 | 0.3 | ✅ PASS |
| Median absolute deviation | stat_medad | 25.3 | 25.3 | 0.6 | ✅ PASS |
| Coefficient of variation | stat_cov | 133 | 134 | 27 | ✅ PASS |
| Energy | stat_energy | 6.48e+08 | 6.48e+08 | 3.9e+07 | ✅ PASS |
| Root mean square | stat_rms | 42.5 | 42.5 | 0.9 | ✅ PASS |
Test 9.B: Simoncelli
Configuration: B map level 2
| Feature | Code | Calc | Ref | Tol | Status |
|---|---|---|---|---|---|
| Mean | stat_mean | 2.68 | 2.68 | 0.22 | ✅ PASS |
| Variance | stat_var | 5.49e+03 | 5.49e+03 | 220 | ✅ PASS |
| Skewness | stat_skew | -0.0858 | -0.0858 | 0.0107 | ✅ PASS |
| (Excess) kurtosis | stat_kurt | 5.58 | 5.58 | 0.18 | ✅ PASS |
| Median | stat_median | 0.233 | 0.233 | 0.046 | ✅ PASS |
| Minimum | stat_min | -605 | -605 | 2 | ✅ PASS |
| 10th percentile | stat_p10 | -65.9 | -65.9 | 2.2 | ✅ PASS |
| 90th percentile | stat_p90 | 82.9 | 82.8 | 1.8 | ✅ PASS |
| Maximum | stat_max | 471 | 471 | 13 | ✅ PASS |
| Interquartile range | stat_iqr | 41.4 | 41 | 1 | ✅ PASS |
| Range | stat_range | 1.08e+03 | 1.08e+03 | 20 | ✅ PASS |
| Mean absolute deviation | stat_mad | 45.1 | 45.1 | 1.1 | ✅ PASS |
| Robust mean absolute deviation | stat_rmad | 21 | 21 | 0.5 | ✅ PASS |
| Median absolute deviation | stat_medad | 45 | 45 | 1.1 | ✅ PASS |
| Coefficient of variation | stat_cov | 27.7 | 27.7 | 20.4 | ✅ PASS |
| Quartile coefficient of dispersion | stat_qcod | 47.4 | 47.4 | 20.7 | ✅ PASS |
| Energy | stat_energy | 1.97e+09 | 1.97e+09 | 1.4e+08 | ✅ PASS |
| Root mean square | stat_rms | 74.1 | 74.1 | 1.6 | ✅ PASS |
Known Deviations
2D Configuration (Config A) Not Implemented
The following tests check filter performance in 2D mode (Config A). These are skipped because Pictologics is purely a 3D radiomics library.
- Tests 1.A - 9.A: 2D versions of the above tests.