Skip to main content

EasyMedicalImages

The easy way to manipulate medical images

---------------------------------------------------------------------------

This is a library that focuses on taking CT scans (as NIFTI Images) and transforming them into arrays in python; giving the user easy ways to manipulate them as well. This can easily be used for downstream usage of CT images within a Python script.

Installation

Requires Python 3.12 or newer.

pip install easy-medical-images

The high-level batch loader (HighLevel) is a compiled C++ extension. The published wheels include it, so a normal pip install is all you need.

Expected data layout

Each case lives in its own folder containing an image and a segmentation. By default these are named image.nii.gz and tumor_segmentation_v2.nii.gz, but you can override both names (see image_path and seg_path below).

parent_folder/
├── case_0001/
│   ├── image.nii.gz
│   └── tumor_segmentation_v2.nii.gz
├── case_0002/
│   ├── image.nii.gz
│   └── tumor_segmentation_v2.nii.gz
└── ...

Remeber to put the proper root for the input directory path! For example, if your files live on a cloud.

CTImagesLibrary operates on a single case folder. HighLevel operates on a parent folder and loads every case folder inside it.

How it fits together

Generally, this library assumes the user wants a batch of something rather than a specific image. This is reflected in how you first load in your specific instance, and then can add modifiers how you wish.

There are two main sub libraries:

  1. HighLevel: point it at a parent directory and it loads every case in parallel (after the method 'run_on_directory' is called on the instance). This will return a list of (image, seg) array pairs. Use this to pull a whole dataset into memory quickly.
  2. CTImagesLibrary: load one case and get the full manipulation toolkit (slicing, cropping, reorientation, display). Use this when you want to work with an individual scan. See below for examples.

Quick start: load a whole directory

import EasyMedicalImages as EMI

path_to_folder_of_ct_scans = input("Input path to CT scans: ")
instance = EMI.HighLevel(path_to_folder=path_to_folder_of_ct_scans)

img_seg_pairs_mega_list = instance.run_on_directory()  # list of (image, seg) array pairs
'''
img_seg_pairs_mega_list=[(img1, seg1),(img2, seg2)...]
'''

# Each entry is one case
img, seg = img_seg_pairs_mega_list[0]
print(f"{len(img_seg_pairs_mega_list)} cases loaded")
print(f"First image shape: {img.shape}, seg shape: {seg.shape}")

Every entry in img_seg_pairs_mega_list is a tuple of two NumPy arrays: the image and its segmentation. Both are already resampled to isotropic spacing and reoriented to RAS, so they are ready to use.

To access all of the images or all of the segs while keeping order, one can simply do:

all_images=[images for images,_ in img_seg_pairs_mega_list]
all_segmentations=[segmentations for _, segmentations in img_seg_pairs_mega_list]

# Both of the below will print the entire array
print(f"Images: {all_images}")
print(f"Segmentation Masks: {all_segmentations}")

# This just shows the shape, easier to comprehend.
print([(img.shape, seg.shape) for img, seg in img_seg_pairs_mega_list])

Working with a single case

from EasyMedicalImages import CTImagesLibrary

case = CTImagesLibrary(path_to_folder="path/to/one/case")

# The voxels are automatically processed upon calling of the instance, unlike the batch version.
print(case.mutated_img_data.shape)
print(case.mutated_seg_data.shape)

# Display three orthogonal slices (slice numbers are 1-based, ordered X, Y, Z)
case.display_slice(slice_number=(175, 279, 57), img_or_seg="img")

# Get those same slices back as arrays
slice_x, slice_y, slice_z = case.return_slice(slice_number=(175, 279, 57), img_or_seg="img")

# Crop the whole volume down to the segmented region (modifies the mutated arrays in place)
case.apply_seg_crop_to_image(img_or_seg="both")
print(case.mutated_img_data.shape)  # smaller now

As stated earlier, building CTImagesLibrary automatically: changes the working directory into path_to_folder, loads the image and segmentation, and builds isotropic, RAS-reoriented copies. After construction, both the raw and processed arrays are available as attributes via your_instancename.raw_img_data, or for seg your_instancename.raw_seg_data.

Affines and voxel spacing

The 4x4 affine is what maps voxel indices to physical (mm) space, so it is the key to any real-world measurement: voxel spacing, distances, and volumes. Both sublibraries can hand you the affines; from there the spacing is a one-liner.

Getting affines from HighLevel

Pass return_affines=True to run_on_directory and every case comes back with its affines attached. Each entry becomes ((image, image_affine), (seg, seg_affine)):

import EasyMedicalImages as EMI

instance = EMI.HighLevel(path_to_folder="path/to/parent")
pairs = instance.run_on_directory(return_affines=True)

# Unpack the first case
(img, img_affine), (seg, seg_affine) = pairs[0]
print(img.shape, img_affine.shape)   # e.g. (512, 512, 340) (4, 4)

To pull all the images or all the affines while keeping order:

all_images  = [img        for (img, _), _        in pairs]
all_affines = [img_affine for (_, img_affine), _ in pairs]

Getting affines from CTImagesLibrary

A single-case instance already exposes them as attributes, so no flag is needed:

from EasyMedicalImages import CTImagesLibrary

case = CTImagesLibrary(path_to_folder="path/to/one/case")

img_affine = case.mutated_img_affine   # processed (isotropic, RAS) grid
seg_affine = case.mutated_seg_affine
# case.raw_img_affine / case.raw_seg_affine hold the originals, before resampling

Voxel spacing and volume

The voxel spacing along each axis is the length of each column of the affine's top-left 3x3 block, which is exactly how the library measures spacing internally when it resamples:

import numpy as np

spacing = np.linalg.norm(img_affine[:3, :3], axis=0)   # (sx, sy, sz) in mm
print(f"voxel spacing (mm): {spacing}")

Because the processed (mutated_*) arrays are isotropic, those three numbers are equal. The physical volume of a single voxel is the product of the spacings, or equivalently the absolute determinant of that same 3x3 block (the determinant form also stays correct for anisotropic or rotated grids, such as the raw ones):

voxel_volume_mm3 = abs(np.linalg.det(img_affine[:3, :3]))
print(f"voxel volume: {voxel_volume_mm3:.4f} mm^3")

That is all you need for physical measurements. For example, the volume of a segmented region is its non-background voxel count times the voxel volume:

n_voxels = np.count_nonzero(seg)          # every voxel where seg != 0
volume_mm3 = n_voxels * voxel_volume_mm3
print(f"segmented volume: {volume_mm3:.1f} mm^3  ({volume_mm3 / 1000:.2f} mL)")

Further detail

This section goes one level deeper on each of the two sublibraries: how you construct it, and what you can call on it once you have an instance. Both are reached through the top-level package (import EasyMedicalImages as EMI, then EMI.HighLevel or EMI.CTImagesLibrary).

HighLevel

The batch sublibrary. Point it at a parent folder, call run_on_directory, and get every case back as (image, seg) array pairs. This is the one to reach for when you want a whole dataset in memory at once.

Construct it (default parameters):

HighLevel(
    path_to_folder,
    image_path="image.nii.gz",
    seg_path="tumor_segmentation_v2.nii.gz",
    verbose=False,
    thread_deadline_time=100.1,
    verbose_workers=True
)
  • path_to_folder: parent folder whose immediate subfolders are individual cases.
  • image_path, seg_path: file names to look for inside each case folder.
  • verbose: passed through to each worker for extra logging.
  • thread_deadline_time: per-case wall-clock budget in seconds. A worker that runs longer is killed and that case is skipped. This is to prevent a thread, which is just stalling or trying to load a not image, from stoping the whole process.
  • verbose_workers: print per-worker progress (which case each worker picked up, load confirmations, and the final count).

Methods:

  • run_on_directory(directory_path="", return_affines=False) Loads every case in the directory and returns a list of (image, seg) tuples, one per case, in the same order as the folders on disk. Both elements are NumPy arrays, already resampled to isotropic spacing and reoriented to RAS. If directory_path is given it overrides path_to_folder for that one call. return_affines will return the affines with the images, making the resulting format ((image, image_affine), (seg, seg_affine)). This allows easy calculation of grid spacing and 3D object information (see Affines and voxel spacing above). Cases that fail to load or exceed thread_deadline_time are dropped, so the returned list can be shorter than the number of folders in theory (so don't set this too low).

Loading runs in parallel: one worker subprocess per case. On Linux it respects the CPU affinity set by schedulers such as SLURM, so it behaves correctly on a cluster node. On this note, becuase some clusters use cores intead of threads, it has safe logic build in for this. If it detects less than 3 threads or 3 cores, it will simply use half of what it finds (so likely using 1 thread or 1 core, unless something very strange is going on hardware wise). Otherwise, it will use the max number of threads/cores it finds minus 1.

  • how_many_threads_available() Returns the number of hardware threads detected (the figure the worker pool is sized from). Honors SLURM cpuset limits on Linux and falls back sensibly when the OS reports nothing.

  • processed_run_on_directory() A special version of run_on_directory that applies a method to all items loaded. Presently, only apply_seg_crop_to_image is allowed. Example:

    hl = HighLevel(r"W:\...\dataset")           # or however you construct it
    
    pairs = hl.run_on_directory()               # unchanged plain load
    
    pairs = hl.processed_run_on_directory(     # crop every case to the seg bbox
    "apply_seg_crop_to_image",
    {"img_or_seg": "both", "pad": 5},
    )
    # -> list[tuple[np.ndarray, np.ndarray]]
    
  • go_one_level_deep() A method which will display all of the items in a directory, be them folders, files, or both. If no perameter is specified for directory_path it will simply use the root given at HighLevels class construction. Example:

    hl = HighLevel(root, "image.nii.gz", "tumor_segmentation_v2.nii.gz")
    hl.go_one_level_deep()                          # -> list[str] of subfolder paths
    hl.go_one_level_deep(options="files")           # regular files only
    hl.go_one_level_deep(options="all")             # everything
    hl.go_one_level_deep(directory_path=other_dir)  # scan a different dir this call onl
    

CTImagesLibrary

The single-case sublibrary. Construct it on one case folder and the data is processed and waiting on the instance; from there you slice, crop, reorient, and display. This is the toolkit HighLevel runs under the hood for each case, so the arrays you get out of either path match.

Construct it (default parameters):

CTImagesLibrary(
    path_to_folder,
    image_path="image.nii.gz",
    seg_path="tumor_segmentation_v2.nii.gz",
    verbose=True,
    return_affines=False,
)

The image and segmentation are loaded and processed during construction, so the attributes below are ready as soon as the instance exists.

Attributes on the instance:

  • raw_img_data, raw_seg_data: the original voxel arrays as loaded.
  • raw_img_affine, raw_seg_affine: the original 4x4 affine matrices.
  • mutated_img_data, mutated_seg_data: isotropic, RAS-reoriented copies. These are usually what you want for machine learning.
  • mutated_img_affine, mutated_seg_affine: affines describing the processed grid.

(See Affines and voxel spacing for turning any of these affines into voxel spacing or a physical volume.)

methods:

  • display_slice(slice_number=(), cmap="viridis", view_axes=("X", "Y", "Z"), load_mutated=True, crop=False, pad=5, img_or_seg="img") Shows one slice per requested axis side by side with matplotlib. slice_number is a 1-based (X, Y, Z) tuple and must contain exactly three values. Set load_mutated=False to view the original (non-isotropic) volume, crop=True to trim each slice to its own non-background region (with pad voxels of margin), and img_or_seg="seg" to view the segmentation instead.

  • return_slice(slice_number=(), view_axes=("X", "Y", "Z"), load_mutated=True, one_list=False, crop=False, pad=5, img_or_seg="img") Returns slices as arrays instead of displaying them. With the default three axes it returns (slice_x, slice_y, slice_z); set one_list=True to get them as a single array of three instead (convenient for batching). Request a single axis (for example view_axes=("Z",)) to get just that one slice back. The arrays match exactly what display_slice shows.

  • apply_seg_crop_to_image(pad=5, return_data=False, img_or_seg="both") Crops the full 3D volume in place to the bounding box of the segmentation, keeping pad voxels of margin. This overwrites mutated_img_data and mutated_seg_data (and their affines) with the cropped versions. Use img_or_seg to crop only "img", only "seg", or "both" (the default). If the segmentation is empty, nothing is cropped. Set return_data=True to also return the cropped arrays.

  • apply_seg_crop_to_slice(slice_number=(), one_list=False, pad=5, img_or_seg="img") The 2D version: returns the X, Y, and Z slices cropped to the segmentation's footprint in each plane. Unlike the 3D version, this runs on the image or the segmentation, not both at once (img_or_seg is "img" by default). slice_number is the same 1-based (X, Y, Z) tuple.

Notes on orientation

The processed arrays (mutated_img_data and friends) are in proper RAS orientation. The slices produced by display_slice and return_slice add a 90-degree flip on the Z axis so they read naturally in matplotlib (similar to how ITK displays them). In short: use the instance arrays when you need correct anatomical orientation, and use return_slice when you want something that looks right on screen.

PyPI link: PyPI

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

easy_medical_images-1.1.6.tar.gz (55.8 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

easy_medical_images-1.1.6-cp314-cp314-win_amd64.whl (579.7 kB view details)

Uploaded CPython 3.14Windows x86-64

easy_medical_images-1.1.6-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (237.5 kB view details)

Uploaded CPython 3.14manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

easy_medical_images-1.1.6-cp314-cp314-macosx_11_0_arm64.whl (137.1 kB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

easy_medical_images-1.1.6-cp314-cp314-macosx_10_15_x86_64.whl (144.3 kB view details)

Uploaded CPython 3.14macOS 10.15+ x86-64

easy_medical_images-1.1.6-cp313-cp313-win_amd64.whl (560.2 kB view details)

Uploaded CPython 3.13Windows x86-64

easy_medical_images-1.1.6-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (237.4 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

easy_medical_images-1.1.6-cp313-cp313-macosx_11_0_arm64.whl (136.8 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

easy_medical_images-1.1.6-cp313-cp313-macosx_10_15_x86_64.whl (144.2 kB view details)

Uploaded CPython 3.13macOS 10.15+ x86-64

easy_medical_images-1.1.6-cp312-cp312-win_amd64.whl (560.1 kB view details)

Uploaded CPython 3.12Windows x86-64

easy_medical_images-1.1.6-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (237.4 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

easy_medical_images-1.1.6-cp312-cp312-macosx_11_0_arm64.whl (136.7 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

easy_medical_images-1.1.6-cp312-cp312-macosx_10_15_x86_64.whl (144.1 kB view details)

Uploaded CPython 3.12macOS 10.15+ x86-64

File details

Details for the file easy_medical_images-1.1.6.tar.gz.

File metadata

  • Download URL: easy_medical_images-1.1.6.tar.gz
  • Upload date:
  • Size: 55.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for easy_medical_images-1.1.6.tar.gz
Algorithm Hash digest
SHA256 c593ea1358a02cfba52fe70d643751b3d93af1dffa33cdfa6fdc7ca4b5bcfe61
MD5 d758c67a96e53c547b095ddaf9c3720b
BLAKE2b-256 afcab703141528419d324d7bad39438e79c1eeede56c29eabf450f47c8e41ade

See more details on using hashes here.

Provenance

The following attestation bundles were made for easy_medical_images-1.1.6.tar.gz:

Publisher: publish.yml on AIM-HI-Lab/EasyMedicalImages

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file easy_medical_images-1.1.6-cp314-cp314-win_amd64.whl.

File metadata

File hashes

Hashes for easy_medical_images-1.1.6-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 54df3811c8e91e06794c33950bf2d1c9d9088262ee947dc11d555eeea98572fa
MD5 22cf26a4e5109efd8c4e204014a5519a
BLAKE2b-256 9a8e5914ecc9a502ed5b47a34dacaaaf3004cd7491a93ff3f8f34b87bae0172a

See more details on using hashes here.

Provenance

The following attestation bundles were made for easy_medical_images-1.1.6-cp314-cp314-win_amd64.whl:

Publisher: publish.yml on AIM-HI-Lab/EasyMedicalImages

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file easy_medical_images-1.1.6-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for easy_medical_images-1.1.6-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 d7968847ef9e76dd984bc2c7211ca0674426fd7054d33efbfaca8ef7dc6149d1
MD5 ea98e31953a7cb0c25a4478d85bed42f
BLAKE2b-256 cd5c19f5ec018e6f129afeb2f94a152cb584921b811fa87f5b85bb7bc0fc5e32

See more details on using hashes here.

Provenance

The following attestation bundles were made for easy_medical_images-1.1.6-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl:

Publisher: publish.yml on AIM-HI-Lab/EasyMedicalImages

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file easy_medical_images-1.1.6-cp314-cp314-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for easy_medical_images-1.1.6-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 d5c3465dd17a21d13145edc2bd0ea835cb925aa0aa76d1cd9860f0044e1f0b83
MD5 78b6d57f8aa04018ec23db9d0420f159
BLAKE2b-256 95233471bd27c8e1fc8541105ed4d39df6d2f6b1be9cdac46010f1ebc803060b

See more details on using hashes here.

Provenance

The following attestation bundles were made for easy_medical_images-1.1.6-cp314-cp314-macosx_11_0_arm64.whl:

Publisher: publish.yml on AIM-HI-Lab/EasyMedicalImages

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file easy_medical_images-1.1.6-cp314-cp314-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for easy_medical_images-1.1.6-cp314-cp314-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 246e71c8a95335887af5f1580baf816f49a3424bb66fc51ef9d1bb494cbcad69
MD5 b93d41c7090c5c9fdcabbcf3759e4e75
BLAKE2b-256 ca1839475f634bb622eca6315605055a334ae973ca130f97e35c1be751d5f34f

See more details on using hashes here.

Provenance

The following attestation bundles were made for easy_medical_images-1.1.6-cp314-cp314-macosx_10_15_x86_64.whl:

Publisher: publish.yml on AIM-HI-Lab/EasyMedicalImages

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file easy_medical_images-1.1.6-cp313-cp313-win_amd64.whl.

File metadata

File hashes

Hashes for easy_medical_images-1.1.6-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 e603ff5579a90ecfb592d30a47897e484cbbb96a12e1668f88498dd868710749
MD5 0ac63e9dfa58a5cd7256d3f555cc7825
BLAKE2b-256 f0ff8d7470f5dc07209fc5071fe480e2251690d9e302c96bf3327c00ee484265

See more details on using hashes here.

Provenance

The following attestation bundles were made for easy_medical_images-1.1.6-cp313-cp313-win_amd64.whl:

Publisher: publish.yml on AIM-HI-Lab/EasyMedicalImages

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file easy_medical_images-1.1.6-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for easy_medical_images-1.1.6-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 2d0a1d76702c1c2c2157df6ba2bdf8a43a7bf89135ed9ab89e0630d113cb9c62
MD5 5bd3882ce55240b41312f2760d637b1d
BLAKE2b-256 3d3930217c46038520a92923700a887140994fac0ee682f1aa74ae8ed4ca94e9

See more details on using hashes here.

Provenance

The following attestation bundles were made for easy_medical_images-1.1.6-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl:

Publisher: publish.yml on AIM-HI-Lab/EasyMedicalImages

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file easy_medical_images-1.1.6-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for easy_medical_images-1.1.6-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 431c14db54a5307d3db71fa736b0e7ceb7a87ff4375edad16ffeeb98f0e7e7d5
MD5 90e46a9e4efc79408dea8af364414fdc
BLAKE2b-256 b72259189bad8957e8345855badf4e46dd860f15cf5911b2e45c44dbaf5ab094

See more details on using hashes here.

Provenance

The following attestation bundles were made for easy_medical_images-1.1.6-cp313-cp313-macosx_11_0_arm64.whl:

Publisher: publish.yml on AIM-HI-Lab/EasyMedicalImages

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file easy_medical_images-1.1.6-cp313-cp313-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for easy_medical_images-1.1.6-cp313-cp313-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 9f3e1cec828f6a94e77712b7f2af7a5db368ffc694d3c27b8a7ebf5181efa1a2
MD5 6e2c0b821b226b04d636d8316b697c22
BLAKE2b-256 ba368795e0a2871950c73c630550b5016084dbbf787ecf8372a0b23dc5a43a82

See more details on using hashes here.

Provenance

The following attestation bundles were made for easy_medical_images-1.1.6-cp313-cp313-macosx_10_15_x86_64.whl:

Publisher: publish.yml on AIM-HI-Lab/EasyMedicalImages

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file easy_medical_images-1.1.6-cp312-cp312-win_amd64.whl.

File metadata

File hashes

Hashes for easy_medical_images-1.1.6-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 613158ebc3488dc010b7dc558c1824beb89dfc367ecc376d0ad30eed65103108
MD5 c82d871b95874ec7342041a6f583c863
BLAKE2b-256 507c98364dab8ca469953e2b721394dd4ac3e24c226f552914207bf57a1e3900

See more details on using hashes here.

Provenance

The following attestation bundles were made for easy_medical_images-1.1.6-cp312-cp312-win_amd64.whl:

Publisher: publish.yml on AIM-HI-Lab/EasyMedicalImages

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file easy_medical_images-1.1.6-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for easy_medical_images-1.1.6-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 6066264bc2e8260f8846b90cdf5934e732b288f44f9e9fbb7c074a7367268b4d
MD5 0b44d8a2a7bc42a3846cf1185309c7e0
BLAKE2b-256 b27178fc7c58d89e6cae7245b52adf0208411f7e16cc4aa3a11480582cba6965

See more details on using hashes here.

Provenance

The following attestation bundles were made for easy_medical_images-1.1.6-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl:

Publisher: publish.yml on AIM-HI-Lab/EasyMedicalImages

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file easy_medical_images-1.1.6-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for easy_medical_images-1.1.6-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 97237913fbe766ed865e939e6803a81080d24ca06c9cf7a118484903ce438dd2
MD5 f3a676513dbb311da5d5f55ed03d274c
BLAKE2b-256 620c8398515b89ed6fd6d85ba66620b52b62710b58e06ebcb9d154809cdf6017

See more details on using hashes here.

Provenance

The following attestation bundles were made for easy_medical_images-1.1.6-cp312-cp312-macosx_11_0_arm64.whl:

Publisher: publish.yml on AIM-HI-Lab/EasyMedicalImages

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file easy_medical_images-1.1.6-cp312-cp312-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for easy_medical_images-1.1.6-cp312-cp312-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 cacf7d532b11633cbcba7667034b56458c130406b12c4f58833f02ab94db87a0
MD5 be232a36e57c95cb0b1a63faabcdb261
BLAKE2b-256 3c01232bb170c7fe8985447f98c753d5c232da974fbfc70a0278ef3e122bdfe7

See more details on using hashes here.

Provenance

The following attestation bundles were made for easy_medical_images-1.1.6-cp312-cp312-macosx_10_15_x86_64.whl:

Publisher: publish.yml on AIM-HI-Lab/EasyMedicalImages

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.
Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page