Bits & Flames bitsandflames/fyron

Synthetic DICOM/NIfTI Export

fyron.dicom.synthetic writes generated or transformed image volumes back to research-friendly files. It is meant for GAN studies, augmentation audits, synthetic cohort experiments, and reproducibility checks where geometry and identifiers must stay explicit.

Use this when the volume is synthetic or derived. Use fyron.imaging.write_nifti for ordinary local NIfTI I/O, and use DICOM SEG when the output is a segmentation object that must reference source DICOM images.

What This Module Is For

Synthetic image export has two jobs:

  • preserve clinically meaningful geometry from original images,
  • avoid accidentally writing generated images with real patient identifiers.

The default behavior is intentionally cautious. DICOM outputs get new Study, Series, and SOP Instance UIDs; patient tags are replaced by synthetic values; and the series is marked as derived synthetic data.

Required Inputs

FunctionRequiredMeaning
write_synthetic_niftivolume, output_path3D array or SimpleITK image plus destination .nii / .nii.gz
write_synthetic_dicom_seriesvolume, output_dir3D volume in (z, y, x) order plus output folder

Optional Inputs

ParameterFunctionDefaultDescription
reference_imagewrite_synthetic_niftiNoneSimpleITK image or path whose geometry is copied.
spacing, origin, directionwrite_synthetic_niftiNoneExplicit geometry overrides.
dtypewrite_synthetic_nifti"float32"Output image pixel type.
metadatawrite_synthetic_niftiNoneExtra SimpleITK metadata fields, when the target image format preserves them.
reference_dicom_dirwrite_synthetic_dicom_seriesNoneOriginal DICOM folder used for geometry.
reference_datasetswrite_synthetic_dicom_seriesNonepydicom datasets or paths used for geometry.
patient_idwrite_synthetic_dicom_series"SYNTHETIC"Synthetic PatientID written by default.
copy_patient_tagswrite_synthetic_dicom_seriesFalseExplicit opt-in to copy patient tags from references.
intensity_modewrite_synthetic_dicom_series"hu""hu" applies rescale slope/intercept; "raw" stores raw intensities.

Returned Outputs

write_synthetic_nifti returns the resolved output Path.

write_synthetic_dicom_series returns a manifest DataFrame with one row per slice:

ColumnMeaning
slice_indexzero-based volume slice index
pathwritten DICOM file
sop_instance_uidgenerated SOP Instance UID
study_instance_uidgenerated or supplied Study UID
series_instance_uidgenerated or supplied Series UID
z_positionDICOM ImagePositionPatient z value
rows, columnspixel matrix size

Minimal NIfTI Example

python
import numpy as np
import SimpleITK as sitk

from fyron.dicom.synthetic import write_synthetic_nifti

reference = sitk.ReadImage("original_ct.nii.gz")
generated = np.zeros((128, 256, 256), dtype="float32")

write_synthetic_nifti(
    volume=generated,
    output_path="synthetic_ct.nii.gz",
    reference_image=reference,
    metadata={"generator": "gan_v1"},
)

Minimal DICOM Example

python
import numpy as np

from fyron.dicom.synthetic import write_synthetic_dicom_series

generated_hu = np.zeros((96, 512, 512), dtype="float32")

manifest = write_synthetic_dicom_series(
    volume=generated_hu,
    output_dir="dicom_synthetic/case_001",
    reference_dicom_dir="dicom_original/case_001",
    patient_id="SYN_CASE_001",
    series_description="Synthetic GAN CT",
)

Clinical Research Example

python
from fyron.audit import create_provenance_manifest, write_manifest
from fyron.dicom.synthetic import write_synthetic_dicom_series

manifest = write_synthetic_dicom_series(
    volume=gan_volume_hu,
    output_dir="outputs/synthetic_dicom/patient_0001",
    reference_dicom_dir="inputs/original_dicom/patient_0001",
    patient_id="SYN_PATIENT_0001",
    series_description="Synthetic abdomen CT generated for GAN audit",
)

audit = create_provenance_manifest(
    title="Synthetic GAN CT export",
    inputs=["inputs/original_dicom/patient_0001"],
    outputs=manifest["path"].tolist(),
    parameters={
        "intensity_mode": "hu",
        "copy_patient_tags": False,
    },
)

write_manifest(audit, "outputs/synthetic_dicom/patient_0001/manifest.json")

Common Pitfalls

  • Generated DICOM slices should not reuse original patient identifiers unless this is explicitly required and ethically approved.
  • A synthetic DICOM series is not a DICOM SEG. Use fyron.dicom.seg for masks.
  • For HU-like CT data, keep intensity_mode="hu" so RescaleIntercept and RescaleSlope describe the stored pixel values.
  • If reference geometry is missing, the writer uses simple axial geometry. That is useful for simulations, not for source-linked clinical export.

Function Table

FunctionPurpose
write_synthetic_nifti(volume, output_path, ...)Write synthetic volume to .nii / .nii.gz.
write_synthetic_dicom_series(volume, output_dir, ...)Write synthetic volume as a DICOM slice series and return a manifest.