ngio 0.4.0a4__tar.gz → 0.4.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (266) hide show
  1. {ngio-0.4.0a4 → ngio-0.4.1}/.github/workflows/build_docs.yml +1 -1
  2. {ngio-0.4.0a4 → ngio-0.4.1}/.github/workflows/ci.yml +2 -2
  3. {ngio-0.4.0a4 → ngio-0.4.1}/CHANGELOG.md +16 -10
  4. {ngio-0.4.0a4 → ngio-0.4.1}/PKG-INFO +14 -14
  5. {ngio-0.4.0a4 → ngio-0.4.1}/README.md +13 -12
  6. ngio-0.4.1/docs/api/iterators.md +17 -0
  7. ngio-0.4.1/docs/api/ngio/io_pipes.md +3 -0
  8. ngio-0.4.1/docs/api/ngio/iterators.md +3 -0
  9. ngio-0.4.1/docs/api/ngio/transforms.md +3 -0
  10. {ngio-0.4.0a4 → ngio-0.4.1}/docs/getting_started/2_images.md +14 -3
  11. ngio-0.4.1/docs/getting_started/6_iterators.md +14 -0
  12. {ngio-0.4.0a4 → ngio-0.4.1}/docs/index.md +11 -9
  13. {ngio-0.4.0a4 → ngio-0.4.1}/docs/tutorials/create_ome_zarr.ipynb +1 -1
  14. ngio-0.4.1/docs/tutorials/feature_extraction.ipynb +168 -0
  15. {ngio-0.4.0a4 → ngio-0.4.1}/docs/tutorials/hcs_exploration.ipynb +0 -10
  16. {ngio-0.4.0a4 → ngio-0.4.1}/docs/tutorials/image_processing.ipynb +54 -5
  17. {ngio-0.4.0a4 → ngio-0.4.1}/docs/tutorials/image_segmentation.ipynb +107 -17
  18. {ngio-0.4.0a4 → ngio-0.4.1}/mkdocs.yml +6 -1
  19. {ngio-0.4.0a4 → ngio-0.4.1}/pyproject.toml +1 -1
  20. {ngio-0.4.0a4 → ngio-0.4.1}/src/ngio/common/_dimensions.py +209 -189
  21. {ngio-0.4.0a4 → ngio-0.4.1}/src/ngio/common/_roi.py +2 -2
  22. {ngio-0.4.0a4 → ngio-0.4.1}/src/ngio/experimental/iterators/__init__.py +0 -2
  23. ngio-0.4.1/src/ngio/experimental/iterators/_abstract_iterator.py +390 -0
  24. {ngio-0.4.0a4 → ngio-0.4.1}/src/ngio/experimental/iterators/_feature.py +84 -41
  25. {ngio-0.4.0a4 → ngio-0.4.1}/src/ngio/experimental/iterators/_image_processing.py +7 -36
  26. ngio-0.4.1/src/ngio/experimental/iterators/_mappers.py +48 -0
  27. {ngio-0.4.0a4 → ngio-0.4.1}/src/ngio/experimental/iterators/_segmentation.py +7 -38
  28. {ngio-0.4.0a4 → ngio-0.4.1}/src/ngio/images/_abstract_image.py +60 -5
  29. {ngio-0.4.0a4 → ngio-0.4.1}/src/ngio/images/_image.py +2 -0
  30. {ngio-0.4.0a4 → ngio-0.4.1}/src/ngio/images/_label.py +2 -0
  31. {ngio-0.4.0a4 → ngio-0.4.1}/src/ngio/images/_masked_image.py +22 -17
  32. ngio-0.4.1/src/ngio/io_pipes/__init__.py +75 -0
  33. {ngio-0.4.0a4 → ngio-0.4.1}/src/ngio/io_pipes/_io_pipes.py +93 -18
  34. {ngio-0.4.0a4 → ngio-0.4.1}/src/ngio/io_pipes/_io_pipes_masked.py +17 -10
  35. {ngio-0.4.0a4 → ngio-0.4.1}/src/ngio/io_pipes/_io_pipes_roi.py +10 -1
  36. ngio-0.4.1/src/ngio/io_pipes/_io_pipes_types.py +56 -0
  37. ngio-0.4.1/src/ngio/io_pipes/_ops_axes.py +344 -0
  38. ngio-0.4.1/src/ngio/io_pipes/_ops_slices.py +446 -0
  39. ngio-0.4.1/src/ngio/io_pipes/_ops_slices_utils.py +196 -0
  40. {ngio-0.4.0a4 → ngio-0.4.1}/src/ngio/io_pipes/_ops_transforms.py +1 -1
  41. {ngio-0.4.0a4 → ngio-0.4.1}/src/ngio/io_pipes/_zoom_transform.py +11 -6
  42. {ngio-0.4.0a4 → ngio-0.4.1}/src/ngio/ome_zarr_meta/__init__.py +0 -2
  43. {ngio-0.4.0a4 → ngio-0.4.1}/src/ngio/ome_zarr_meta/ngio_specs/__init__.py +0 -2
  44. {ngio-0.4.0a4 → ngio-0.4.1}/src/ngio/ome_zarr_meta/ngio_specs/_axes.py +7 -131
  45. {ngio-0.4.0a4 → ngio-0.4.1}/src/ngio/utils/_datasets.py +5 -0
  46. ngio-0.4.1/tests/unit/common/test_dimensions.py +161 -0
  47. ngio-0.4.1/tests/unit/common/test_roi.py +201 -0
  48. {ngio-0.4.0a4 → ngio-0.4.1}/tests/unit/images/test_images.py +36 -3
  49. ngio-0.4.1/tests/unit/io_pipes/test_axes_ops.py +48 -0
  50. ngio-0.4.1/tests/unit/io_pipes/test_slicing_ops.py +112 -0
  51. {ngio-0.4.0a4 → ngio-0.4.1}/tests/unit/iterators/test_iterators.py +26 -1
  52. {ngio-0.4.0a4 → ngio-0.4.1}/tests/unit/ome_zarr_meta/test_unit_ngio_specs.py +0 -49
  53. ngio-0.4.0a4/docs/tutorials/feature_extraction.ipynb +0 -118
  54. ngio-0.4.0a4/src/ngio/experimental/iterators/_abstract_iterator.py +0 -170
  55. ngio-0.4.0a4/src/ngio/io_pipes/__init__.py +0 -49
  56. ngio-0.4.0a4/src/ngio/io_pipes/_io_pipes_utils.py +0 -299
  57. ngio-0.4.0a4/src/ngio/io_pipes/_ops_axes.py +0 -146
  58. ngio-0.4.0a4/src/ngio/io_pipes/_ops_slices.py +0 -218
  59. ngio-0.4.0a4/tests/unit/common/test_dimensions.py +0 -89
  60. ngio-0.4.0a4/tests/unit/common/test_roi.py +0 -40
  61. {ngio-0.4.0a4 → ngio-0.4.1}/.copier-answers.yml +0 -0
  62. {ngio-0.4.0a4 → ngio-0.4.1}/.gitattributes +0 -0
  63. {ngio-0.4.0a4 → ngio-0.4.1}/.github/ISSUE_TEMPLATE.md +0 -0
  64. {ngio-0.4.0a4 → ngio-0.4.1}/.github/TEST_FAIL_TEMPLATE.md +0 -0
  65. {ngio-0.4.0a4 → ngio-0.4.1}/.github/dependabot.yml +0 -0
  66. {ngio-0.4.0a4 → ngio-0.4.1}/.github/pull_request_template.md +0 -0
  67. {ngio-0.4.0a4 → ngio-0.4.1}/.gitignore +0 -0
  68. {ngio-0.4.0a4 → ngio-0.4.1}/.pre-commit-config.yaml +0 -0
  69. {ngio-0.4.0a4 → ngio-0.4.1}/LICENSE +0 -0
  70. {ngio-0.4.0a4 → ngio-0.4.1}/_typos.toml +0 -0
  71. {ngio-0.4.0a4 → ngio-0.4.1}/docs/api/hcs.md +0 -0
  72. {ngio-0.4.0a4 → ngio-0.4.1}/docs/api/images.md +0 -0
  73. {ngio-0.4.0a4 → ngio-0.4.1}/docs/api/ngio/common.md +0 -0
  74. {ngio-0.4.0a4 → ngio-0.4.1}/docs/api/ngio/hcs.md +0 -0
  75. {ngio-0.4.0a4 → ngio-0.4.1}/docs/api/ngio/images.md +0 -0
  76. {ngio-0.4.0a4 → ngio-0.4.1}/docs/api/ngio/ngio.md +0 -0
  77. {ngio-0.4.0a4 → ngio-0.4.1}/docs/api/ngio/tables.md +0 -0
  78. {ngio-0.4.0a4 → ngio-0.4.1}/docs/api/ngio/utils.md +0 -0
  79. {ngio-0.4.0a4 → ngio-0.4.1}/docs/api/ome_zarr_container.md +0 -0
  80. {ngio-0.4.0a4 → ngio-0.4.1}/docs/api/tables.md +0 -0
  81. {ngio-0.4.0a4 → ngio-0.4.1}/docs/changelog.md +0 -0
  82. {ngio-0.4.0a4 → ngio-0.4.1}/docs/code_of_conduct.md +0 -0
  83. {ngio-0.4.0a4 → ngio-0.4.1}/docs/contributing.md +0 -0
  84. {ngio-0.4.0a4 → ngio-0.4.1}/docs/getting_started/0_quickstart.md +0 -0
  85. {ngio-0.4.0a4 → ngio-0.4.1}/docs/getting_started/1_ome_zarr_containers.md +0 -0
  86. {ngio-0.4.0a4 → ngio-0.4.1}/docs/getting_started/3_tables.md +0 -0
  87. {ngio-0.4.0a4 → ngio-0.4.1}/docs/getting_started/4_masked_images.md +0 -0
  88. {ngio-0.4.0a4 → ngio-0.4.1}/docs/getting_started/5_hcs.md +0 -0
  89. {ngio-0.4.0a4 → ngio-0.4.1}/docs/table_specs/backend.md +0 -0
  90. {ngio-0.4.0a4 → ngio-0.4.1}/docs/table_specs/overview.md +0 -0
  91. {ngio-0.4.0a4 → ngio-0.4.1}/docs/table_specs/table_types/condition_table.md +0 -0
  92. {ngio-0.4.0a4 → ngio-0.4.1}/docs/table_specs/table_types/custom_table.md +0 -0
  93. {ngio-0.4.0a4 → ngio-0.4.1}/docs/table_specs/table_types/feature_table.md +0 -0
  94. {ngio-0.4.0a4 → ngio-0.4.1}/docs/table_specs/table_types/generic_table.md +0 -0
  95. {ngio-0.4.0a4 → ngio-0.4.1}/docs/table_specs/table_types/masking_roi_table.md +0 -0
  96. {ngio-0.4.0a4 → ngio-0.4.1}/docs/table_specs/table_types/roi_table.md +0 -0
  97. {ngio-0.4.0a4 → ngio-0.4.1}/src/ngio/__init__.py +0 -0
  98. {ngio-0.4.0a4 → ngio-0.4.1}/src/ngio/common/__init__.py +0 -0
  99. {ngio-0.4.0a4 → ngio-0.4.1}/src/ngio/common/_masking_roi.py +0 -0
  100. {ngio-0.4.0a4 → ngio-0.4.1}/src/ngio/common/_pyramid.py +0 -0
  101. {ngio-0.4.0a4 → ngio-0.4.1}/src/ngio/common/_synt_images_utils.py +0 -0
  102. {ngio-0.4.0a4 → ngio-0.4.1}/src/ngio/common/_zoom.py +0 -0
  103. {ngio-0.4.0a4 → ngio-0.4.1}/src/ngio/experimental/__init__.py +0 -0
  104. {ngio-0.4.0a4 → ngio-0.4.1}/src/ngio/experimental/iterators/_rois_utils.py +0 -0
  105. {ngio-0.4.0a4 → ngio-0.4.1}/src/ngio/hcs/__init__.py +0 -0
  106. {ngio-0.4.0a4 → ngio-0.4.1}/src/ngio/hcs/_plate.py +0 -0
  107. {ngio-0.4.0a4 → ngio-0.4.1}/src/ngio/images/__init__.py +0 -0
  108. {ngio-0.4.0a4 → ngio-0.4.1}/src/ngio/images/_create.py +0 -0
  109. {ngio-0.4.0a4 → ngio-0.4.1}/src/ngio/images/_create_synt_container.py +0 -0
  110. {ngio-0.4.0a4 → ngio-0.4.1}/src/ngio/images/_ome_zarr_container.py +0 -0
  111. {ngio-0.4.0a4 → ngio-0.4.1}/src/ngio/images/_table_ops.py +0 -0
  112. {ngio-0.4.0a4 → ngio-0.4.1}/src/ngio/io_pipes/_match_shape.py +0 -0
  113. {ngio-0.4.0a4 → ngio-0.4.1}/src/ngio/ome_zarr_meta/_meta_handlers.py +0 -0
  114. {ngio-0.4.0a4 → ngio-0.4.1}/src/ngio/ome_zarr_meta/ngio_specs/_channels.py +0 -0
  115. {ngio-0.4.0a4 → ngio-0.4.1}/src/ngio/ome_zarr_meta/ngio_specs/_dataset.py +0 -0
  116. {ngio-0.4.0a4 → ngio-0.4.1}/src/ngio/ome_zarr_meta/ngio_specs/_ngio_hcs.py +0 -0
  117. {ngio-0.4.0a4 → ngio-0.4.1}/src/ngio/ome_zarr_meta/ngio_specs/_ngio_image.py +0 -0
  118. {ngio-0.4.0a4 → ngio-0.4.1}/src/ngio/ome_zarr_meta/ngio_specs/_pixel_size.py +0 -0
  119. {ngio-0.4.0a4 → ngio-0.4.1}/src/ngio/ome_zarr_meta/v04/__init__.py +0 -0
  120. {ngio-0.4.0a4 → ngio-0.4.1}/src/ngio/ome_zarr_meta/v04/_custom_models.py +0 -0
  121. {ngio-0.4.0a4 → ngio-0.4.1}/src/ngio/ome_zarr_meta/v04/_v04_spec_utils.py +0 -0
  122. {ngio-0.4.0a4 → ngio-0.4.1}/src/ngio/resources/20200812-CardiomyocyteDifferentiation14-Cycle1_B03/mask.png +0 -0
  123. {ngio-0.4.0a4 → ngio-0.4.1}/src/ngio/resources/20200812-CardiomyocyteDifferentiation14-Cycle1_B03/nuclei.png +0 -0
  124. {ngio-0.4.0a4 → ngio-0.4.1}/src/ngio/resources/20200812-CardiomyocyteDifferentiation14-Cycle1_B03/raw.jpg +0 -0
  125. {ngio-0.4.0a4 → ngio-0.4.1}/src/ngio/resources/__init__.py +0 -0
  126. {ngio-0.4.0a4 → ngio-0.4.1}/src/ngio/resources/resource_model.py +0 -0
  127. {ngio-0.4.0a4 → ngio-0.4.1}/src/ngio/tables/__init__.py +0 -0
  128. {ngio-0.4.0a4 → ngio-0.4.1}/src/ngio/tables/_abstract_table.py +0 -0
  129. {ngio-0.4.0a4 → ngio-0.4.1}/src/ngio/tables/_tables_container.py +0 -0
  130. {ngio-0.4.0a4 → ngio-0.4.1}/src/ngio/tables/backends/__init__.py +0 -0
  131. {ngio-0.4.0a4 → ngio-0.4.1}/src/ngio/tables/backends/_abstract_backend.py +0 -0
  132. {ngio-0.4.0a4 → ngio-0.4.1}/src/ngio/tables/backends/_anndata.py +0 -0
  133. {ngio-0.4.0a4 → ngio-0.4.1}/src/ngio/tables/backends/_anndata_utils.py +0 -0
  134. {ngio-0.4.0a4 → ngio-0.4.1}/src/ngio/tables/backends/_csv.py +0 -0
  135. {ngio-0.4.0a4 → ngio-0.4.1}/src/ngio/tables/backends/_json.py +0 -0
  136. {ngio-0.4.0a4 → ngio-0.4.1}/src/ngio/tables/backends/_non_zarr_backends.py +0 -0
  137. {ngio-0.4.0a4 → ngio-0.4.1}/src/ngio/tables/backends/_parquet.py +0 -0
  138. {ngio-0.4.0a4 → ngio-0.4.1}/src/ngio/tables/backends/_table_backends.py +0 -0
  139. {ngio-0.4.0a4 → ngio-0.4.1}/src/ngio/tables/backends/_utils.py +0 -0
  140. {ngio-0.4.0a4 → ngio-0.4.1}/src/ngio/tables/v1/__init__.py +0 -0
  141. {ngio-0.4.0a4 → ngio-0.4.1}/src/ngio/tables/v1/_condition_table.py +0 -0
  142. {ngio-0.4.0a4 → ngio-0.4.1}/src/ngio/tables/v1/_feature_table.py +0 -0
  143. {ngio-0.4.0a4 → ngio-0.4.1}/src/ngio/tables/v1/_generic_table.py +0 -0
  144. {ngio-0.4.0a4 → ngio-0.4.1}/src/ngio/tables/v1/_roi_table.py +0 -0
  145. {ngio-0.4.0a4 → ngio-0.4.1}/src/ngio/transforms/__init__.py +0 -0
  146. {ngio-0.4.0a4 → ngio-0.4.1}/src/ngio/transforms/_zoom.py +0 -0
  147. {ngio-0.4.0a4 → ngio-0.4.1}/src/ngio/utils/__init__.py +0 -0
  148. {ngio-0.4.0a4 → ngio-0.4.1}/src/ngio/utils/_errors.py +0 -0
  149. {ngio-0.4.0a4 → ngio-0.4.1}/src/ngio/utils/_fractal_fsspec_store.py +0 -0
  150. {ngio-0.4.0a4 → ngio-0.4.1}/src/ngio/utils/_logger.py +0 -0
  151. {ngio-0.4.0a4 → ngio-0.4.1}/src/ngio/utils/_zarr_utils.py +0 -0
  152. {ngio-0.4.0a4 → ngio-0.4.1}/tests/conftest.py +0 -0
  153. {ngio-0.4.0a4 → ngio-0.4.1}/tests/data/v04/images/test_image_c1yx.zarr/.zattrs +0 -0
  154. {ngio-0.4.0a4 → ngio-0.4.1}/tests/data/v04/images/test_image_c1yx.zarr/.zgroup +0 -0
  155. {ngio-0.4.0a4 → ngio-0.4.1}/tests/data/v04/images/test_image_c1yx.zarr/0/.zarray +0 -0
  156. {ngio-0.4.0a4 → ngio-0.4.1}/tests/data/v04/images/test_image_c1yx.zarr/1/.zarray +0 -0
  157. {ngio-0.4.0a4 → ngio-0.4.1}/tests/data/v04/images/test_image_c1yx.zarr/labels/.zattrs +0 -0
  158. {ngio-0.4.0a4 → ngio-0.4.1}/tests/data/v04/images/test_image_c1yx.zarr/labels/.zgroup +0 -0
  159. {ngio-0.4.0a4 → ngio-0.4.1}/tests/data/v04/images/test_image_c1yx.zarr/labels/label/.zattrs +0 -0
  160. {ngio-0.4.0a4 → ngio-0.4.1}/tests/data/v04/images/test_image_c1yx.zarr/labels/label/.zgroup +0 -0
  161. {ngio-0.4.0a4 → ngio-0.4.1}/tests/data/v04/images/test_image_c1yx.zarr/labels/label/0/.zarray +0 -0
  162. {ngio-0.4.0a4 → ngio-0.4.1}/tests/data/v04/images/test_image_c1yx.zarr/labels/label/1/.zarray +0 -0
  163. {ngio-0.4.0a4 → ngio-0.4.1}/tests/data/v04/images/test_image_cyx.zarr/.zattrs +0 -0
  164. {ngio-0.4.0a4 → ngio-0.4.1}/tests/data/v04/images/test_image_cyx.zarr/.zgroup +0 -0
  165. {ngio-0.4.0a4 → ngio-0.4.1}/tests/data/v04/images/test_image_cyx.zarr/0/.zarray +0 -0
  166. {ngio-0.4.0a4 → ngio-0.4.1}/tests/data/v04/images/test_image_cyx.zarr/1/.zarray +0 -0
  167. {ngio-0.4.0a4 → ngio-0.4.1}/tests/data/v04/images/test_image_cyx.zarr/labels/.zattrs +0 -0
  168. {ngio-0.4.0a4 → ngio-0.4.1}/tests/data/v04/images/test_image_cyx.zarr/labels/.zgroup +0 -0
  169. {ngio-0.4.0a4 → ngio-0.4.1}/tests/data/v04/images/test_image_cyx.zarr/labels/label/.zattrs +0 -0
  170. {ngio-0.4.0a4 → ngio-0.4.1}/tests/data/v04/images/test_image_cyx.zarr/labels/label/.zgroup +0 -0
  171. {ngio-0.4.0a4 → ngio-0.4.1}/tests/data/v04/images/test_image_cyx.zarr/labels/label/0/.zarray +0 -0
  172. {ngio-0.4.0a4 → ngio-0.4.1}/tests/data/v04/images/test_image_cyx.zarr/labels/label/1/.zarray +0 -0
  173. {ngio-0.4.0a4 → ngio-0.4.1}/tests/data/v04/images/test_image_czyx.zarr/.zattrs +0 -0
  174. {ngio-0.4.0a4 → ngio-0.4.1}/tests/data/v04/images/test_image_czyx.zarr/.zgroup +0 -0
  175. {ngio-0.4.0a4 → ngio-0.4.1}/tests/data/v04/images/test_image_czyx.zarr/0/.zarray +0 -0
  176. {ngio-0.4.0a4 → ngio-0.4.1}/tests/data/v04/images/test_image_czyx.zarr/1/.zarray +0 -0
  177. {ngio-0.4.0a4 → ngio-0.4.1}/tests/data/v04/images/test_image_czyx.zarr/labels/.zattrs +0 -0
  178. {ngio-0.4.0a4 → ngio-0.4.1}/tests/data/v04/images/test_image_czyx.zarr/labels/.zgroup +0 -0
  179. {ngio-0.4.0a4 → ngio-0.4.1}/tests/data/v04/images/test_image_czyx.zarr/labels/label/.zattrs +0 -0
  180. {ngio-0.4.0a4 → ngio-0.4.1}/tests/data/v04/images/test_image_czyx.zarr/labels/label/.zgroup +0 -0
  181. {ngio-0.4.0a4 → ngio-0.4.1}/tests/data/v04/images/test_image_czyx.zarr/labels/label/0/.zarray +0 -0
  182. {ngio-0.4.0a4 → ngio-0.4.1}/tests/data/v04/images/test_image_czyx.zarr/labels/label/1/.zarray +0 -0
  183. {ngio-0.4.0a4 → ngio-0.4.1}/tests/data/v04/images/test_image_tcyx.zarr/.zattrs +0 -0
  184. {ngio-0.4.0a4 → ngio-0.4.1}/tests/data/v04/images/test_image_tcyx.zarr/.zgroup +0 -0
  185. {ngio-0.4.0a4 → ngio-0.4.1}/tests/data/v04/images/test_image_tcyx.zarr/0/.zarray +0 -0
  186. {ngio-0.4.0a4 → ngio-0.4.1}/tests/data/v04/images/test_image_tcyx.zarr/1/.zarray +0 -0
  187. {ngio-0.4.0a4 → ngio-0.4.1}/tests/data/v04/images/test_image_tcyx.zarr/labels/.zattrs +0 -0
  188. {ngio-0.4.0a4 → ngio-0.4.1}/tests/data/v04/images/test_image_tcyx.zarr/labels/.zgroup +0 -0
  189. {ngio-0.4.0a4 → ngio-0.4.1}/tests/data/v04/images/test_image_tcyx.zarr/labels/label/.zattrs +0 -0
  190. {ngio-0.4.0a4 → ngio-0.4.1}/tests/data/v04/images/test_image_tcyx.zarr/labels/label/.zgroup +0 -0
  191. {ngio-0.4.0a4 → ngio-0.4.1}/tests/data/v04/images/test_image_tcyx.zarr/labels/label/0/.zarray +0 -0
  192. {ngio-0.4.0a4 → ngio-0.4.1}/tests/data/v04/images/test_image_tcyx.zarr/labels/label/1/.zarray +0 -0
  193. {ngio-0.4.0a4 → ngio-0.4.1}/tests/data/v04/images/test_image_tczyx.zarr/.zattrs +0 -0
  194. {ngio-0.4.0a4 → ngio-0.4.1}/tests/data/v04/images/test_image_tczyx.zarr/.zgroup +0 -0
  195. {ngio-0.4.0a4 → ngio-0.4.1}/tests/data/v04/images/test_image_tczyx.zarr/0/.zarray +0 -0
  196. {ngio-0.4.0a4 → ngio-0.4.1}/tests/data/v04/images/test_image_tczyx.zarr/1/.zarray +0 -0
  197. {ngio-0.4.0a4 → ngio-0.4.1}/tests/data/v04/images/test_image_tczyx.zarr/labels/.zattrs +0 -0
  198. {ngio-0.4.0a4 → ngio-0.4.1}/tests/data/v04/images/test_image_tczyx.zarr/labels/.zgroup +0 -0
  199. {ngio-0.4.0a4 → ngio-0.4.1}/tests/data/v04/images/test_image_tczyx.zarr/labels/label/.zattrs +0 -0
  200. {ngio-0.4.0a4 → ngio-0.4.1}/tests/data/v04/images/test_image_tczyx.zarr/labels/label/.zgroup +0 -0
  201. {ngio-0.4.0a4 → ngio-0.4.1}/tests/data/v04/images/test_image_tczyx.zarr/labels/label/0/.zarray +0 -0
  202. {ngio-0.4.0a4 → ngio-0.4.1}/tests/data/v04/images/test_image_tczyx.zarr/labels/label/1/.zarray +0 -0
  203. {ngio-0.4.0a4 → ngio-0.4.1}/tests/data/v04/images/test_image_tyx.zarr/.zattrs +0 -0
  204. {ngio-0.4.0a4 → ngio-0.4.1}/tests/data/v04/images/test_image_tyx.zarr/.zgroup +0 -0
  205. {ngio-0.4.0a4 → ngio-0.4.1}/tests/data/v04/images/test_image_tyx.zarr/0/.zarray +0 -0
  206. {ngio-0.4.0a4 → ngio-0.4.1}/tests/data/v04/images/test_image_tyx.zarr/1/.zarray +0 -0
  207. {ngio-0.4.0a4 → ngio-0.4.1}/tests/data/v04/images/test_image_tyx.zarr/labels/.zattrs +0 -0
  208. {ngio-0.4.0a4 → ngio-0.4.1}/tests/data/v04/images/test_image_tyx.zarr/labels/.zgroup +0 -0
  209. {ngio-0.4.0a4 → ngio-0.4.1}/tests/data/v04/images/test_image_tyx.zarr/labels/label/.zattrs +0 -0
  210. {ngio-0.4.0a4 → ngio-0.4.1}/tests/data/v04/images/test_image_tyx.zarr/labels/label/.zgroup +0 -0
  211. {ngio-0.4.0a4 → ngio-0.4.1}/tests/data/v04/images/test_image_tyx.zarr/labels/label/0/.zarray +0 -0
  212. {ngio-0.4.0a4 → ngio-0.4.1}/tests/data/v04/images/test_image_tyx.zarr/labels/label/1/.zarray +0 -0
  213. {ngio-0.4.0a4 → ngio-0.4.1}/tests/data/v04/images/test_image_tzyx.zarr/.zattrs +0 -0
  214. {ngio-0.4.0a4 → ngio-0.4.1}/tests/data/v04/images/test_image_tzyx.zarr/.zgroup +0 -0
  215. {ngio-0.4.0a4 → ngio-0.4.1}/tests/data/v04/images/test_image_tzyx.zarr/0/.zarray +0 -0
  216. {ngio-0.4.0a4 → ngio-0.4.1}/tests/data/v04/images/test_image_tzyx.zarr/1/.zarray +0 -0
  217. {ngio-0.4.0a4 → ngio-0.4.1}/tests/data/v04/images/test_image_tzyx.zarr/labels/.zattrs +0 -0
  218. {ngio-0.4.0a4 → ngio-0.4.1}/tests/data/v04/images/test_image_tzyx.zarr/labels/.zgroup +0 -0
  219. {ngio-0.4.0a4 → ngio-0.4.1}/tests/data/v04/images/test_image_tzyx.zarr/labels/label/.zattrs +0 -0
  220. {ngio-0.4.0a4 → ngio-0.4.1}/tests/data/v04/images/test_image_tzyx.zarr/labels/label/.zgroup +0 -0
  221. {ngio-0.4.0a4 → ngio-0.4.1}/tests/data/v04/images/test_image_tzyx.zarr/labels/label/0/.zarray +0 -0
  222. {ngio-0.4.0a4 → ngio-0.4.1}/tests/data/v04/images/test_image_tzyx.zarr/labels/label/1/.zarray +0 -0
  223. {ngio-0.4.0a4 → ngio-0.4.1}/tests/data/v04/images/test_image_yx.zarr/.zattrs +0 -0
  224. {ngio-0.4.0a4 → ngio-0.4.1}/tests/data/v04/images/test_image_yx.zarr/.zgroup +0 -0
  225. {ngio-0.4.0a4 → ngio-0.4.1}/tests/data/v04/images/test_image_yx.zarr/0/.zarray +0 -0
  226. {ngio-0.4.0a4 → ngio-0.4.1}/tests/data/v04/images/test_image_yx.zarr/1/.zarray +0 -0
  227. {ngio-0.4.0a4 → ngio-0.4.1}/tests/data/v04/images/test_image_yx.zarr/labels/.zattrs +0 -0
  228. {ngio-0.4.0a4 → ngio-0.4.1}/tests/data/v04/images/test_image_yx.zarr/labels/.zgroup +0 -0
  229. {ngio-0.4.0a4 → ngio-0.4.1}/tests/data/v04/images/test_image_yx.zarr/labels/label/.zattrs +0 -0
  230. {ngio-0.4.0a4 → ngio-0.4.1}/tests/data/v04/images/test_image_yx.zarr/labels/label/.zgroup +0 -0
  231. {ngio-0.4.0a4 → ngio-0.4.1}/tests/data/v04/images/test_image_yx.zarr/labels/label/0/.zarray +0 -0
  232. {ngio-0.4.0a4 → ngio-0.4.1}/tests/data/v04/images/test_image_yx.zarr/labels/label/1/.zarray +0 -0
  233. {ngio-0.4.0a4 → ngio-0.4.1}/tests/data/v04/images/test_image_zyx.zarr/.zattrs +0 -0
  234. {ngio-0.4.0a4 → ngio-0.4.1}/tests/data/v04/images/test_image_zyx.zarr/.zgroup +0 -0
  235. {ngio-0.4.0a4 → ngio-0.4.1}/tests/data/v04/images/test_image_zyx.zarr/0/.zarray +0 -0
  236. {ngio-0.4.0a4 → ngio-0.4.1}/tests/data/v04/images/test_image_zyx.zarr/1/.zarray +0 -0
  237. {ngio-0.4.0a4 → ngio-0.4.1}/tests/data/v04/images/test_image_zyx.zarr/labels/.zattrs +0 -0
  238. {ngio-0.4.0a4 → ngio-0.4.1}/tests/data/v04/images/test_image_zyx.zarr/labels/.zgroup +0 -0
  239. {ngio-0.4.0a4 → ngio-0.4.1}/tests/data/v04/images/test_image_zyx.zarr/labels/label/.zattrs +0 -0
  240. {ngio-0.4.0a4 → ngio-0.4.1}/tests/data/v04/images/test_image_zyx.zarr/labels/label/.zgroup +0 -0
  241. {ngio-0.4.0a4 → ngio-0.4.1}/tests/data/v04/images/test_image_zyx.zarr/labels/label/0/.zarray +0 -0
  242. {ngio-0.4.0a4 → ngio-0.4.1}/tests/data/v04/images/test_image_zyx.zarr/labels/label/1/.zarray +0 -0
  243. {ngio-0.4.0a4 → ngio-0.4.1}/tests/data/v04/meta/base_ome_zarr_image_meta.json +0 -0
  244. {ngio-0.4.0a4 → ngio-0.4.1}/tests/data/v04/meta/base_ome_zarr_image_meta_wrong_axis_order.json +0 -0
  245. {ngio-0.4.0a4 → ngio-0.4.1}/tests/data/v04/meta/base_ome_zarr_label_meta.json +0 -0
  246. {ngio-0.4.0a4 → ngio-0.4.1}/tests/data/v04/meta/base_ome_zarr_well_meta.json +0 -0
  247. {ngio-0.4.0a4 → ngio-0.4.1}/tests/data/v04/meta/ome_zarr_well_path_normalization_meta.json +0 -0
  248. {ngio-0.4.0a4 → ngio-0.4.1}/tests/unit/common/test_pyramid.py +0 -0
  249. {ngio-0.4.0a4 → ngio-0.4.1}/tests/unit/common/test_transforms.py +0 -0
  250. {ngio-0.4.0a4 → ngio-0.4.1}/tests/unit/hcs/test_plate.py +0 -0
  251. {ngio-0.4.0a4 → ngio-0.4.1}/tests/unit/hcs/test_well.py +0 -0
  252. {ngio-0.4.0a4 → ngio-0.4.1}/tests/unit/images/test_create.py +0 -0
  253. {ngio-0.4.0a4 → ngio-0.4.1}/tests/unit/images/test_masked_images.py +0 -0
  254. {ngio-0.4.0a4 → ngio-0.4.1}/tests/unit/images/test_omezarr_container.py +0 -0
  255. {ngio-0.4.0a4 → ngio-0.4.1}/tests/unit/images/test_table_ops.py +0 -0
  256. {ngio-0.4.0a4 → ngio-0.4.1}/tests/unit/ome_zarr_meta/test_image_handler.py +0 -0
  257. {ngio-0.4.0a4 → ngio-0.4.1}/tests/unit/ome_zarr_meta/test_unit_v04_utils.py +0 -0
  258. {ngio-0.4.0a4 → ngio-0.4.1}/tests/unit/tables/test_backends.py +0 -0
  259. {ngio-0.4.0a4 → ngio-0.4.1}/tests/unit/tables/test_backends_utils.py +0 -0
  260. {ngio-0.4.0a4 → ngio-0.4.1}/tests/unit/tables/test_feature_table.py +0 -0
  261. {ngio-0.4.0a4 → ngio-0.4.1}/tests/unit/tables/test_generic_table.py +0 -0
  262. {ngio-0.4.0a4 → ngio-0.4.1}/tests/unit/tables/test_masking_roi_table_v1.py +0 -0
  263. {ngio-0.4.0a4 → ngio-0.4.1}/tests/unit/tables/test_roi_table_v1.py +0 -0
  264. {ngio-0.4.0a4 → ngio-0.4.1}/tests/unit/tables/test_table_group.py +0 -0
  265. {ngio-0.4.0a4 → ngio-0.4.1}/tests/unit/utils/test_download_datasets.py +0 -0
  266. {ngio-0.4.0a4 → ngio-0.4.1}/tests/unit/utils/test_zarr_utils.py +0 -0
@@ -22,7 +22,7 @@ jobs:
22
22
  with:
23
23
  fetch-depth: 0
24
24
  - name: 🐍 Set up Python
25
- uses: actions/setup-python@v5
25
+ uses: actions/setup-python@v6
26
26
  with:
27
27
  python-version: "3.13"
28
28
  cache-dependency-path: "pyproject.toml"
@@ -40,7 +40,7 @@ jobs:
40
40
  - uses: actions/checkout@v5
41
41
 
42
42
  - name: 🐍 Set up Python ${{ matrix.python-version }}
43
- uses: actions/setup-python@v5
43
+ uses: actions/setup-python@v6
44
44
  with:
45
45
  python-version: ${{ matrix.python-version }}
46
46
  cache-dependency-path: "pyproject.toml"
@@ -103,7 +103,7 @@ jobs:
103
103
  fetch-depth: 0
104
104
 
105
105
  - name: 🐍 Set up Python
106
- uses: actions/setup-python@v5
106
+ uses: actions/setup-python@v6
107
107
  with:
108
108
  python-version: "3.x"
109
109
 
@@ -1,13 +1,22 @@
1
1
  # Changelog
2
2
 
3
- ## [v0.4.0a1]
3
+ ## [v0.4.1]
4
+
5
+ ### Bug Fixes
6
+ - Fix bug in zoom transform when input axes contain unknown axes (e.g. virtual axes). Now unknown axes are treated as virtual axes and set to 1 in the target shape.
7
+
8
+ ## [v0.4.0]
4
9
 
5
10
  ### Features
6
11
 
7
- - add support for time in rois and roi-tables
12
+ - Add Iterators for image processing pipelines
13
+ - Add support for time in rois and roi-tables
8
14
  - Building masking roi tables expanded to time series data
9
- - add experimental support for Iterators
10
- - add support for rescaling on-the-fly masks for masked images
15
+ - Add zoom transformation
16
+ - Add support for rescaling on-the-fly masks for masked images
17
+ - Big refactor of the io pipeline to support iterators and lazy loading
18
+ - Add support for customize dimension separators and compression codecs
19
+ - Simplify AxesHandler and Dataset Classes
11
20
 
12
21
  ### API Changes
13
22
 
@@ -19,15 +28,12 @@
19
28
  - Image like objects now have a more clean API to load data. Instead of `get_array` and `set_array`, they now use `get_as_numpy`, and `get_as_dask` for delayed arrays.
20
29
  - Also for `get_roi` now specific methods are available. For ROI objects, the `get_roi_as_numpy`, and `get_roi_as_dask` methods.
21
30
  - Table ops moved to `ngio.images`
22
- - Make `label` an explicit attribute in `Roi` objects.
31
+ - int `label` as an explicit attribute in `Roi` objects (previously only in stored in name and relying on convention)
32
+ - Slight changes to `Image` and `Label` objects. Some minor attributes have been renamed for consistency.
23
33
 
24
34
  ### Table specs
25
35
 
26
- - add `t_second` and `len_t_second` to ROI tables and masking ROI tables
27
-
28
- ### Bug Fixes
29
-
30
- - improve type consistency and remove non-necessary "type: ignore"
36
+ - Add `t_second` and `len_t_second` to ROI tables and masking ROI tables
31
37
 
32
38
  ## [v0.3.5]
33
39
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ngio
3
- Version: 0.4.0a4
3
+ Version: 0.4.1
4
4
  Summary: Next Generation file format IO
5
5
  Project-URL: homepage, https://github.com/BioVisionCenter/ngio
6
6
  Project-URL: repository, https://github.com/BioVisionCenter/ngio
@@ -28,7 +28,6 @@ Requires-Dist: pooch
28
28
  Requires-Dist: pyarrow
29
29
  Requires-Dist: pydantic
30
30
  Requires-Dist: requests
31
- Requires-Dist: xarray
32
31
  Requires-Dist: zarr<3
33
32
  Provides-Extra: dev
34
33
  Requires-Dist: devtools; extra == 'dev'
@@ -83,20 +82,22 @@ Ngio's mission is to streamline working with OME-Zarr files by providing a simpl
83
82
 
84
83
  ## Key Features
85
84
 
86
- ### 📊 Simple Object-Based API
85
+ ### 🔍 Simple Object-Based API
87
86
 
88
87
  - Easily open, explore, and manipulate OME-Zarr images and HCS plates
89
88
  - Create and derive new images and labels with minimal boilerplate code
90
89
 
91
- ### 🔍 Rich Tables and Regions of Interest (ROI) Support
90
+ ### 📊 Rich Tables and Regions of Interest (ROI) Support
92
91
 
92
+ - Tight integration with [tabular data](https://biovisioncenter.github.io/ngio/stable/table_specs/overview/)
93
93
  - Extract and analyze specific regions of interest
94
- - Tight integration with [Tabular Data](https://BioVisionCenter.github.io/ngio/stable/table_specs/overview/)
94
+ - Store measurements and other metadata in the OME-Zarr container
95
+ - Extensible & modular allowing users to define custom table schemas and on disk serialization
95
96
 
96
- ### 🔄 Scalable Data Processing (Coming Soon)
97
+ ### 🔄 Scalable Data Processing
97
98
 
98
- - Powerful iterators for processing data at scale
99
- - Efficient memory management for large datasets
99
+ - Powerful iterators for building scalable and generalizable image processing pipelines
100
+ - Extensible mapping mechanism for custom parallelization strategies
100
101
 
101
102
  ## Installation
102
103
 
@@ -114,23 +115,22 @@ Currently, ngio only supports OME-Zarr v0.4. Support for version 0.5 and higher
114
115
 
115
116
  ## Development Status
116
117
 
117
- !!! warning
118
- Ngio is under active development and is not yet stable. The API is subject to change, and bugs and breaking changes are expected.
119
- We follow [Semantic Versioning](https://semver.org/). Which means for 0.x releases potentially breaking changes can be introduced in minor releases.
118
+ Ngio is under active development and is not yet stable. The API is subject to change, and bugs and breaking changes are expected.
119
+ We follow [Semantic Versioning](https://semver.org/). Which means for 0.x releases potentially breaking changes can be introduced in minor releases.
120
120
 
121
121
  ### Available Features
122
122
 
123
123
  - ✅ OME-Zarr metadata handling and validation
124
124
  - ✅ Image and label access across pyramid levels
125
125
  - ✅ ROI and table support
126
+ - ✅ Image processing iterators
126
127
  - ✅ Streaming from remote sources
127
128
  - ✅ Documentation and examples
128
129
 
129
130
  ### Upcoming Features
130
131
 
131
- - Advanced image processing iterators
132
- - Parallel processing capabilities
133
- - Support for OME-Zarr v0.5 and Zarr v3
132
+ - Support for OME-Zarr v0.5 and Zarr v3 (via `zarr-python` v3)
133
+ - Enhanced performance optimizations (parallel iterators, optimized io strategies)
134
134
 
135
135
  ## Contributors
136
136
 
@@ -16,20 +16,22 @@ Ngio's mission is to streamline working with OME-Zarr files by providing a simpl
16
16
 
17
17
  ## Key Features
18
18
 
19
- ### 📊 Simple Object-Based API
19
+ ### 🔍 Simple Object-Based API
20
20
 
21
21
  - Easily open, explore, and manipulate OME-Zarr images and HCS plates
22
22
  - Create and derive new images and labels with minimal boilerplate code
23
23
 
24
- ### 🔍 Rich Tables and Regions of Interest (ROI) Support
24
+ ### 📊 Rich Tables and Regions of Interest (ROI) Support
25
25
 
26
+ - Tight integration with [tabular data](https://biovisioncenter.github.io/ngio/stable/table_specs/overview/)
26
27
  - Extract and analyze specific regions of interest
27
- - Tight integration with [Tabular Data](https://BioVisionCenter.github.io/ngio/stable/table_specs/overview/)
28
+ - Store measurements and other metadata in the OME-Zarr container
29
+ - Extensible & modular allowing users to define custom table schemas and on disk serialization
28
30
 
29
- ### 🔄 Scalable Data Processing (Coming Soon)
31
+ ### 🔄 Scalable Data Processing
30
32
 
31
- - Powerful iterators for processing data at scale
32
- - Efficient memory management for large datasets
33
+ - Powerful iterators for building scalable and generalizable image processing pipelines
34
+ - Extensible mapping mechanism for custom parallelization strategies
33
35
 
34
36
  ## Installation
35
37
 
@@ -47,23 +49,22 @@ Currently, ngio only supports OME-Zarr v0.4. Support for version 0.5 and higher
47
49
 
48
50
  ## Development Status
49
51
 
50
- !!! warning
51
- Ngio is under active development and is not yet stable. The API is subject to change, and bugs and breaking changes are expected.
52
- We follow [Semantic Versioning](https://semver.org/). Which means for 0.x releases potentially breaking changes can be introduced in minor releases.
52
+ Ngio is under active development and is not yet stable. The API is subject to change, and bugs and breaking changes are expected.
53
+ We follow [Semantic Versioning](https://semver.org/). Which means for 0.x releases potentially breaking changes can be introduced in minor releases.
53
54
 
54
55
  ### Available Features
55
56
 
56
57
  - ✅ OME-Zarr metadata handling and validation
57
58
  - ✅ Image and label access across pyramid levels
58
59
  - ✅ ROI and table support
60
+ - ✅ Image processing iterators
59
61
  - ✅ Streaming from remote sources
60
62
  - ✅ Documentation and examples
61
63
 
62
64
  ### Upcoming Features
63
65
 
64
- - Advanced image processing iterators
65
- - Parallel processing capabilities
66
- - Support for OME-Zarr v0.5 and Zarr v3
66
+ - Support for OME-Zarr v0.5 and Zarr v3 (via `zarr-python` v3)
67
+ - Enhanced performance optimizations (parallel iterators, optimized io strategies)
67
68
 
68
69
  ## Contributors
69
70
 
@@ -0,0 +1,17 @@
1
+ # Iterators API Reference
2
+
3
+ ## ImageProcessingIterator
4
+
5
+ ::: ngio.experimental.iterators.ImageProcessingIterator
6
+
7
+ ## SegmentationIterator
8
+
9
+ ::: ngio.experimental.iterators.SegmentationIterator
10
+
11
+ ## MaskedSegmentationIterator
12
+
13
+ ::: ngio.experimental.iterators.MaskedSegmentationIterator
14
+
15
+ ## FeatureExtractorIterator
16
+
17
+ ::: ngio.experimental.iterators.FeatureExtractorIterator
@@ -0,0 +1,3 @@
1
+ # ngio.io_pipes API documentation
2
+
3
+ ::: ngio.io_pipes
@@ -0,0 +1,3 @@
1
+ # ngio.iterators API documentation
2
+
3
+ ::: ngio.experimental.iterators
@@ -0,0 +1,3 @@
1
+ # ngio.transforms API documentation
2
+
3
+ ::: ngio.transforms
@@ -96,7 +96,7 @@ Once you have the `Image` object, you can access the image data as a:
96
96
  The `get_as_*` can also be used to slice the image data, and query specific axes in specific orders:
97
97
 
98
98
  ```pycon exec="true" source="console" session="get_started"
99
- >>> image_slice = image.get_as_numpy(c=0, x=slice(0, 128), axes_order=["t", "z", "y", "x", "c"]) # Get a specific channel and axes order
99
+ >>> image_slice = image.get_as_numpy(channel_selection="DAPI", x=slice(0, 128), axes_order=["t", "z", "y", "x", "c"]) # Get a specific channel and axes order
100
100
  >>> image_slice.shape
101
101
  >>> print(image_slice.shape) # markdown-exec: hide
102
102
  ```
@@ -113,14 +113,14 @@ A minimal example of how to use the `get_array` and `set_array` methods:
113
113
 
114
114
  ```python exec="true" source="material-block" session="get_started"
115
115
  # Get the image data as a numpy array
116
- data = image.get_as_numpy(c=0, x=slice(0, 128), y=slice(0, 128), axes_order=["z", "y", "x", "c"])
116
+ data = image.get_as_numpy(channel_selection="DAPI", x=slice(0, 128), y=slice(0, 128), axes_order=["z", "y", "x", "c"])
117
117
 
118
118
  # Modify the image data
119
119
  some_function = lambda x: x # markdown-exec: hide
120
120
  data = some_function(data)
121
121
 
122
122
  # Set the modified image data
123
- image.set_array(data, c=0, x=slice(0, 128), y=slice(0, 128), axes_order=["z", "y", "x", "c"])
123
+ image.set_array(data, channel_selection="DAPI", x=slice(0, 128), y=slice(0, 128), axes_order=["z", "y", "x", "c"])
124
124
  image.consolidate() # Consolidate the changes to all resolution levels, see below for more details
125
125
  ```
126
126
 
@@ -131,6 +131,17 @@ image.consolidate() # Consolidate the changes to all resolution levels, see belo
131
131
  ```
132
132
  This will write the changes to the OME-Zarr file at all resolution levels.
133
133
 
134
+ ### World coordinates slicing
135
+
136
+ To read or write a specific region of the image defined in world coordinates, you can use the `Roi` object.
137
+
138
+ ```pycon exec="true" source="console" session="get_started"
139
+ >>> from ngio import Roi
140
+ >>> roi = Roi(x=34.1, y=10, x_length=321.6, y_length=330) # Define a ROI in world coordinates
141
+ >>> image.get_roi_as_numpy(roi) # Get the image data in the ROI as a numpy array
142
+ >>> print(image.get_roi_as_numpy(roi).shape) # markdown-exec: hide
143
+ ```
144
+
134
145
  ## Labels
135
146
 
136
147
  `Labels` represent segmentation masks that identify objects in the image. In ngio `Labels` are similar to `Images` and can
@@ -0,0 +1,14 @@
1
+ # 6. Iterators
2
+
3
+ When building image processing pipelines it is often useful to iterate over specific regions of the image, for example to process the image in smaller tiles or to process only specific regions of interest (ROIs).
4
+
5
+ Moreover, when working with OME-Zarr Images it is often useful to set specific broadcasting rules for the iteration, for example to iterate over all z-planes or iterate over all timepoints.
6
+
7
+ Ngio provides a set of `Iterator` classes that can be used for this purpose. We provide iterators four basic iterators:
8
+
9
+ * The `SegmentationIterator` is designed to build segmentation pipelines, where an input image is processed to produce a segmentation mask. An example use case on how to use the `SegmentationIterator` can be found in the [Image Segmentation Tutorial](../tutorials/image_segmentation.ipynb).
10
+ * The `MaskedSegmentationIterator` is similar to the `SegmentationIterator`, but it uses a masking roi table to restrict the segmentation to masks. This is useful when you want to segment only specific regions of the image, for example, segmenting cells only within a specific tissue region. An example use case on how to use the `MaskedSegmentationIterator` can be found in the [Image Segmentation Tutorial](../tutorials/image_segmentation.ipynb).
11
+ * The `ImageProcessingIterator` is designed to build image processing pipelines, where an input image is processed to produce a new image. An example use case on how to use the `ImageProcessingIterator` can be found in the [Image Processing Tutorial](../tutorials/image_processing.ipynb).
12
+ * The `FeatureExtractionIterator` is read-only iterator designed to iterate over pairs of images and labels to extract features from the image based on the labels. An example use case on how to use the `FeatureExtractionIterator` can be found in the [Feature Extraction Tutorial](../tutorials/feature_extraction.ipynb).
13
+
14
+ A set of more complete example can be found in the [Fractal Tasks Template](https://github.com/fractal-analytics-platform/fractal-tasks-template).
@@ -8,20 +8,22 @@ Ngio's mission is to streamline working with OME-Zarr files by providing a simpl
8
8
 
9
9
  ## Key Features
10
10
 
11
- ### 📊 Simple Object-Based API
11
+ ### 🔍 Simple Object-Based API
12
12
 
13
13
  - Easily open, explore, and manipulate OME-Zarr images and HCS plates
14
14
  - Create and derive new images and labels with minimal boilerplate code
15
15
 
16
- ### 🔍 Rich Tables and Regions of Interest (ROI) Support
16
+ ### 📊 Rich Tables and Regions of Interest (ROI) Support
17
17
 
18
+ - Tight integration with [tabular data](https://biovisioncenter.github.io/ngio/stable/table_specs/overview/)
18
19
  - Extract and analyze specific regions of interest
19
- - Tight integration with [Fractal's table framework](https://BioVisionCenter.github.io/fractal-tasks-core/tables/)
20
+ - Store measurements and other metadata in the OME-Zarr container
21
+ - Extensible & modular allowing users to define custom table schemas and on disk serialization
20
22
 
21
- ### 🔄 Scalable Data Processing (Coming Soon)
23
+ ### 🔄 Scalable Data Processing
22
24
 
23
- - Powerful iterators for processing data at scale
24
- - Efficient memory management for large datasets
25
+ - Powerful iterators for building scalable and generalizable image processing pipelines
26
+ - Extensible mapping mechanism for custom parallelization strategies
25
27
 
26
28
  ## Getting Started
27
29
 
@@ -43,14 +45,14 @@ Currently, ngio only supports OME-Zarr v0.4. Support for version 0.5 and higher
43
45
  - ✅ OME-Zarr metadata handling and validation
44
46
  - ✅ Image and label access across pyramid levels
45
47
  - ✅ ROI and table support
48
+ - ✅ Image processing iterators
46
49
  - ✅ Streaming from remote sources
47
50
  - ✅ Documentation and examples
48
51
 
49
52
  ### Upcoming Features
50
53
 
51
- - Advanced image processing iterators
52
- - Parallel processing capabilities
53
- - Support for OME-Zarr v0.5 and Zarr v3
54
+ - Support for OME-Zarr v0.5 and Zarr v3 (via `zarr-python` v3)
55
+ - Enhanced performance optimizations (parallel iterators, optimized io strategies)
54
56
 
55
57
  ## Contributors
56
58
 
@@ -52,7 +52,7 @@
52
52
  "id": "3",
53
53
  "metadata": {},
54
54
  "source": [
55
- "## Adding Rois to OME-Zarr\n",
55
+ "## Adding a ROI table to an OME-Zarr image\n",
56
56
  "\n",
57
57
  "Often, is useful to add ROIs to OME-Zarr images to be able to retrieve them later. \n",
58
58
  "This can be done using the `ngio` library as follows."
@@ -0,0 +1,168 @@
1
+ {
2
+ "cells": [
3
+ {
4
+ "cell_type": "markdown",
5
+ "metadata": {},
6
+ "source": [
7
+ "# Feature Extraction\n",
8
+ "\n",
9
+ "This sections will cover how to extract regionprops features from an image using `ngio`, `skimage`. Moreover we will also write the features to a table in the ome-zarr container.\n",
10
+ "\n",
11
+ "# Step 1: Open the OME-Zarr Container"
12
+ ]
13
+ },
14
+ {
15
+ "cell_type": "code",
16
+ "execution_count": null,
17
+ "metadata": {},
18
+ "outputs": [],
19
+ "source": [
20
+ "import numpy as np\n",
21
+ "import pandas as pd\n",
22
+ "from skimage import measure\n",
23
+ "\n",
24
+ "\n",
25
+ "def extract_features(image: np.ndarray, label: np.ndarray) -> pd.DataFrame:\n",
26
+ " \"\"\"Basic feature extraction using skimage.measure.regionprops_table.\"\"\"\n",
27
+ " label = label.squeeze(-1) # Remove the channel axis if present\n",
28
+ " roi_feat_table = measure.regionprops_table(\n",
29
+ " label_image=label,\n",
30
+ " intensity_image=image,\n",
31
+ " properties=[\n",
32
+ " \"label\",\n",
33
+ " \"area\",\n",
34
+ " \"mean_intensity\",\n",
35
+ " \"max_intensity\",\n",
36
+ " \"min_intensity\",\n",
37
+ " ],\n",
38
+ " )\n",
39
+ " return pd.DataFrame(roi_feat_table)"
40
+ ]
41
+ },
42
+ {
43
+ "cell_type": "code",
44
+ "execution_count": null,
45
+ "metadata": {},
46
+ "outputs": [],
47
+ "source": [
48
+ "from pathlib import Path\n",
49
+ "\n",
50
+ "from ngio import open_ome_zarr_container\n",
51
+ "from ngio.utils import download_ome_zarr_dataset\n",
52
+ "\n",
53
+ "# Download the dataset\n",
54
+ "download_dir = Path(\".\").absolute().parent.parent / \"data\"\n",
55
+ "hcs_path = download_ome_zarr_dataset(\"CardiomyocyteTinyMip\", download_dir=download_dir)\n",
56
+ "image_path = hcs_path / \"B\" / \"03\" / \"0\"\n",
57
+ "\n",
58
+ "# Open the ome-zarr container\n",
59
+ "ome_zarr = open_ome_zarr_container(image_path)"
60
+ ]
61
+ },
62
+ {
63
+ "cell_type": "markdown",
64
+ "metadata": {},
65
+ "source": [
66
+ "## Step 2: Setup the inputs"
67
+ ]
68
+ },
69
+ {
70
+ "cell_type": "code",
71
+ "execution_count": null,
72
+ "metadata": {},
73
+ "outputs": [],
74
+ "source": [
75
+ "from ngio.transforms import ZoomTransform\n",
76
+ "\n",
77
+ "# First we will need the image object and the FOVs table\n",
78
+ "image = ome_zarr.get_image()\n",
79
+ "\n",
80
+ "# Get the nuclei label\n",
81
+ "nuclei = ome_zarr.get_label(\"nuclei\")\n",
82
+ "\n",
83
+ "# In this example we the image is available at an higher resolution than the nuclei\n",
84
+ "print(f\"Image dimensions: {image.dimensions}, pixel size: {image.pixel_size}\")\n",
85
+ "print(f\"Nuclei dimensions: {nuclei.dimensions}, pixel size: {nuclei.pixel_size}\")\n",
86
+ "\n",
87
+ "# We need to setup a transform to resample the nuclei to the image resolution\n",
88
+ "zoom_transform = ZoomTransform(\n",
89
+ " input_image=nuclei,\n",
90
+ " target_image=image,\n",
91
+ " order=\"nearest\", # Nearest neighbor interpolation for labels\n",
92
+ ")"
93
+ ]
94
+ },
95
+ {
96
+ "cell_type": "markdown",
97
+ "metadata": {},
98
+ "source": [
99
+ "## Step 3: Use the FeatureExtractorIterator to create a feature table"
100
+ ]
101
+ },
102
+ {
103
+ "cell_type": "code",
104
+ "execution_count": null,
105
+ "metadata": {},
106
+ "outputs": [],
107
+ "source": [
108
+ "from ngio.experimental.iterators import FeatureExtractorIterator\n",
109
+ "from ngio.tables import FeatureTable\n",
110
+ "\n",
111
+ "iterator = FeatureExtractorIterator(\n",
112
+ " input_image=image,\n",
113
+ " input_label=nuclei,\n",
114
+ " label_transforms=[zoom_transform],\n",
115
+ " axes_order=[\"y\", \"x\", \"c\"],\n",
116
+ ")\n",
117
+ "\n",
118
+ "feat_table = []\n",
119
+ "for image_data, label_data, roi in iterator.iter_as_numpy():\n",
120
+ " print(f\"Processing ROI: {roi}\")\n",
121
+ " roi_feat_table = extract_features(image=image_data, label=label_data)\n",
122
+ " feat_table.append(roi_feat_table)\n",
123
+ "\n",
124
+ "# Concatenate all the dataframes into a single one\n",
125
+ "feat_table = pd.concat(feat_table)\n",
126
+ "feat_table = FeatureTable(table_data=feat_table, reference_label=\"nuclei\")\n",
127
+ "ome_zarr.add_table(\"nuclei_regionprops\", feat_table)"
128
+ ]
129
+ },
130
+ {
131
+ "cell_type": "markdown",
132
+ "metadata": {},
133
+ "source": [
134
+ "### Sanity Check: Read the Table back"
135
+ ]
136
+ },
137
+ {
138
+ "cell_type": "code",
139
+ "execution_count": null,
140
+ "metadata": {},
141
+ "outputs": [],
142
+ "source": [
143
+ "ome_zarr.get_table(\"nuclei_regionprops\").lazy_frame.collect()"
144
+ ]
145
+ }
146
+ ],
147
+ "metadata": {
148
+ "kernelspec": {
149
+ "display_name": "dev",
150
+ "language": "python",
151
+ "name": "python3"
152
+ },
153
+ "language_info": {
154
+ "codemirror_mode": {
155
+ "name": "ipython",
156
+ "version": 3
157
+ },
158
+ "file_extension": ".py",
159
+ "mimetype": "text/x-python",
160
+ "name": "python",
161
+ "nbconvert_exporter": "python",
162
+ "pygments_lexer": "ipython3",
163
+ "version": "3.11.13"
164
+ }
165
+ },
166
+ "nbformat": 4,
167
+ "nbformat_minor": 2
168
+ }
@@ -102,16 +102,6 @@
102
102
  "print(test_plate)\n",
103
103
  "print(f\"Rows: {test_plate.rows}, Columns: {test_plate.columns}\")"
104
104
  ]
105
- },
106
- {
107
- "cell_type": "markdown",
108
- "metadata": {},
109
- "source": []
110
- },
111
- {
112
- "cell_type": "markdown",
113
- "metadata": {},
114
- "source": []
115
105
  }
116
106
  ],
117
107
  "metadata": {
@@ -11,7 +11,7 @@
11
11
  "For this example we will apply gaussian blur to an image.\n",
12
12
  "\n",
13
13
  "\n",
14
- "# Step 1: Setup\n",
14
+ "## Step 1: Setup\n",
15
15
  "\n",
16
16
  "We will first create a simple function to apply gaussian blur to an image. This function will take an image and a sigma value as input and return the blurred image."
17
17
  ]
@@ -98,7 +98,7 @@
98
98
  "cell_type": "markdown",
99
99
  "metadata": {},
100
100
  "source": [
101
- "# Step 4: Apply the gaussian blur and consolidate the processed image"
101
+ "## Step 4: Apply the gaussian blur and consolidate the processed image"
102
102
  ]
103
103
  },
104
104
  {
@@ -130,7 +130,7 @@
130
130
  "cell_type": "markdown",
131
131
  "metadata": {},
132
132
  "source": [
133
- "# Plot the results\n",
133
+ "### Plot the results\n",
134
134
  "\n",
135
135
  "Finally, we can visualize the original and blurred images using `matplotlib`."
136
136
  ]
@@ -164,7 +164,7 @@
164
164
  "cell_type": "markdown",
165
165
  "metadata": {},
166
166
  "source": [
167
- "## Out of memory processing\n",
167
+ "## Step 5: Out of memory processing\n",
168
168
  "\n",
169
169
  "Sometimes we want to apply some simple processing to larger than memory images. In this case, we can use the `dask` library to process the image in chunks. In `ngio` we can simply query the data as a `dask` array and apply the desired processing function to it."
170
170
  ]
@@ -180,6 +180,9 @@
180
180
  "\n",
181
181
  "def dask_gaussian_blur(image: da.Array, sigma: float) -> da.Array:\n",
182
182
  " \"\"\"Apply gaussian blur to a dask array.\"\"\"\n",
183
+ " # This will itroduce some edge artifacts at chunk boundaries\n",
184
+ " # In a real application, consider using map_overlap to mitigate this\n",
185
+ " # With appropriate depth based on sigma\n",
183
186
  " return da.map_blocks(gaussian_blur, image, dtype=image.dtype, sigma=sigma)\n",
184
187
  "\n",
185
188
  "\n",
@@ -191,7 +194,53 @@
191
194
  {
192
195
  "cell_type": "markdown",
193
196
  "metadata": {},
194
- "source": []
197
+ "source": [
198
+ "## Step 6. Image Processing Iterators\n",
199
+ "\n",
200
+ "`ngio` provides an alternative way to process large images using iterators. This API is not meant to replace `dask` but to provide a simple way to iterate over arbitrary regions, moreover it provides a simple way to implement default broadcasting behaviors."
201
+ ]
202
+ },
203
+ {
204
+ "cell_type": "code",
205
+ "execution_count": null,
206
+ "metadata": {},
207
+ "outputs": [],
208
+ "source": [
209
+ "from ngio.experimental.iterators import ImageProcessingIterator\n",
210
+ "\n",
211
+ "iterator = ImageProcessingIterator(\n",
212
+ " input_image=image,\n",
213
+ " output_image=blurred_image,\n",
214
+ " axes_order=[\"c\", \"z\", \"y\", \"x\"],\n",
215
+ ")\n",
216
+ "\n",
217
+ "# After initializing the iterator, the iterator will have created\n",
218
+ "# will iterate over the entire image.\n",
219
+ "print(f\"Iterator after initialization: {iterator}\")\n",
220
+ "\n",
221
+ "# Iterate over an arbitrary region of interest table\n",
222
+ "# We can use the product method that performs a cartesian product\n",
223
+ "# between the iterator and the table.\n",
224
+ "table = ome_zarr.get_roi_table(\"FOV_ROI_table\")\n",
225
+ "iterator = iterator.product(table)\n",
226
+ "print(f\"Iterator after product with table: {iterator}\")\n",
227
+ "\n",
228
+ "# We can explicitly set a broadcasting behavior\n",
229
+ "# For example we can iterate over all zyx planes, and broadcast all the other\n",
230
+ "# spatial dimensions\n",
231
+ "iterator = iterator.by_zyx()\n",
232
+ "\n",
233
+ "# Finally (if needed) we can check if the regions are not-overlapping\n",
234
+ "iterator.require_no_regions_overlap()\n",
235
+ "# We can also check if the regions lay on non-overlapping chunks\n",
236
+ "iterator.require_no_chunks_overlap()\n",
237
+ "\n",
238
+ "# Now we can map the gaussian blur function to the iterator\n",
239
+ "iterator.map_as_numpy(lambda x: gaussian_blur(x, sigma=sigma))\n",
240
+ "\n",
241
+ "# No need to consolidate, the iterator takes care of that\n",
242
+ "# after all the regions have been processed"
243
+ ]
195
244
  }
196
245
  ],
197
246
  "metadata": {