cellprofiler-library-nightly 5.0.0.dev661__tar.gz → 5.0.0.dev674__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 (127) hide show
  1. {cellprofiler_library_nightly-5.0.0.dev661/cellprofiler_library_nightly.egg-info → cellprofiler_library_nightly-5.0.0.dev674}/PKG-INFO +1 -1
  2. {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/_version.py +3 -3
  3. {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/functions/image_processing.py +241 -2
  4. cellprofiler_library_nightly-5.0.0.dev674/cellprofiler_library/modules/_findmaxima.py +31 -0
  5. cellprofiler_library_nightly-5.0.0.dev674/cellprofiler_library/modules/_rescaleintensity.py +60 -0
  6. cellprofiler_library_nightly-5.0.0.dev674/cellprofiler_library/opts/findmaxima.py +7 -0
  7. cellprofiler_library_nightly-5.0.0.dev674/cellprofiler_library/opts/rescaleintensity.py +39 -0
  8. {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/types.py +14 -5
  9. {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674/cellprofiler_library_nightly.egg-info}/PKG-INFO +1 -1
  10. {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library_nightly.egg-info/SOURCES.txt +4 -0
  11. {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library_nightly.egg-info/scm_file_list.json +4 -0
  12. cellprofiler_library_nightly-5.0.0.dev674/cellprofiler_library_nightly.egg-info/scm_version.json +8 -0
  13. cellprofiler_library_nightly-5.0.0.dev661/cellprofiler_library_nightly.egg-info/scm_version.json +0 -8
  14. {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/LICENSE +0 -0
  15. {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/README.md +0 -0
  16. {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/__init__.py +0 -0
  17. {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/functions/__init__.py +0 -0
  18. {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/functions/file_processing.py +0 -0
  19. {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/functions/measurement.py +0 -0
  20. {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/functions/object_processing.py +0 -0
  21. {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/functions/segmentation.py +0 -0
  22. {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/measurement_model.py +0 -0
  23. {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/modules/__init__.py +0 -0
  24. {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/modules/_align.py +0 -0
  25. {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/modules/_closing.py +0 -0
  26. {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/modules/_colortogray.py +0 -0
  27. {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/modules/_combineobjects.py +0 -0
  28. {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/modules/_convertimagetoobjects.py +0 -0
  29. {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/modules/_convertobjectstoimage.py +0 -0
  30. {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/modules/_correctilluminationapply.py +0 -0
  31. {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/modules/_crop.py +0 -0
  32. {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/modules/_dilateimage.py +0 -0
  33. {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/modules/_dilateobjects.py +0 -0
  34. {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/modules/_enhanceedges.py +0 -0
  35. {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/modules/_enhanceorsuppressfeatures.py +0 -0
  36. {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/modules/_erodeimage.py +0 -0
  37. {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/modules/_erodeobjects.py +0 -0
  38. {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/modules/_expandorshrinkobjects.py +0 -0
  39. {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/modules/_fillobjects.py +0 -0
  40. {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/modules/_filterobjects.py +0 -0
  41. {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/modules/_flipandrotate.py +0 -0
  42. {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/modules/_gaussianfilter.py +0 -0
  43. {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/modules/_graytocolor.py +0 -0
  44. {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/modules/_identifydeadworms.py +0 -0
  45. {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/modules/_identifyprimaryobjects.py +0 -0
  46. {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/modules/_identifysecondaryobjects.py +0 -0
  47. {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/modules/_identifytertiaryobjects.py +0 -0
  48. {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/modules/_imagemath.py +0 -0
  49. {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/modules/_measurecolocalization.py +0 -0
  50. {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/modules/_measuregranularity.py +0 -0
  51. {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/modules/_measureimageareaoccupied.py +0 -0
  52. {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/modules/_measureimageintensity.py +0 -0
  53. {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/modules/_measureimageoverlap.py +0 -0
  54. {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/modules/_measureimagequality.py +0 -0
  55. {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/modules/_measureimageskeleton.py +0 -0
  56. {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/modules/_measureobjectintensity.py +0 -0
  57. {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/modules/_measureobjectintensitydistribution.py +0 -0
  58. {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/modules/_measureobjectneighbors.py +0 -0
  59. {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/modules/_measureobjectoverlap.py +0 -0
  60. {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/modules/_measureobjectsizeshape.py +0 -0
  61. {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/modules/_measureobjectskeleton.py +0 -0
  62. {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/modules/_measuretexture.py +0 -0
  63. {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/modules/_medialaxis.py +0 -0
  64. {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/modules/_medianfilter.py +0 -0
  65. {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/modules/_morph.py +0 -0
  66. {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/modules/_morphologicalskeleton.py +0 -0
  67. {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/modules/_opening.py +0 -0
  68. {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/modules/_overlayobjects.py +0 -0
  69. {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/modules/_overlayoutlines.py +0 -0
  70. {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/modules/_reducenoise.py +0 -0
  71. {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/modules/_removeholes.py +0 -0
  72. {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/modules/_resize.py +0 -0
  73. {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/modules/_savecroppedobjects.py +0 -0
  74. {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/modules/_shrinktoobjectcenters.py +0 -0
  75. {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/modules/_smooth.py +0 -0
  76. {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/modules/_threshold.py +0 -0
  77. {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/modules/_watershed.py +0 -0
  78. {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/opts/__init__.py +0 -0
  79. {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/opts/align.py +0 -0
  80. {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/opts/colortogray.py +0 -0
  81. {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/opts/convertimagetoobjects.py +0 -0
  82. {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/opts/convertobjectstoimage.py +0 -0
  83. {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/opts/correctilluminationapply.py +0 -0
  84. {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/opts/crop.py +0 -0
  85. {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/opts/dilateimage.py +0 -0
  86. {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/opts/dilateobjects.py +0 -0
  87. {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/opts/enhanceedges.py +0 -0
  88. {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/opts/enhanceorsuppressfeatures.py +0 -0
  89. {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/opts/erodeimage.py +0 -0
  90. {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/opts/erodeobjects.py +0 -0
  91. {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/opts/filterobjects.py +0 -0
  92. {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/opts/flipandrotate.py +0 -0
  93. {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/opts/graytocolor.py +0 -0
  94. {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/opts/identifydeadworms.py +0 -0
  95. {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/opts/identifyprimaryobjects.py +0 -0
  96. {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/opts/identifysecondaryobjects.py +0 -0
  97. {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/opts/identifytertiaryobjects.py +0 -0
  98. {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/opts/imagemath.py +0 -0
  99. {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/opts/measurecolocalization.py +0 -0
  100. {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/opts/measuregranularity.py +0 -0
  101. {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/opts/measureimageareaoccupied.py +0 -0
  102. {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/opts/measureimageintensity.py +0 -0
  103. {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/opts/measureimageoverlap.py +0 -0
  104. {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/opts/measureimagequality.py +0 -0
  105. {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/opts/measureimageskeleton.py +0 -0
  106. {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/opts/measureobjectintensity.py +0 -0
  107. {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/opts/measureobjectintensitydistribution.py +0 -0
  108. {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/opts/measureobjectneighbors.py +0 -0
  109. {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/opts/measureobjectoverlap.py +0 -0
  110. {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/opts/measureobjectskeleton.py +0 -0
  111. {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/opts/measuretexture.py +0 -0
  112. {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/opts/morph.py +0 -0
  113. {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/opts/objectsizeshapefeatures.py +0 -0
  114. {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/opts/overlayoutlines.py +0 -0
  115. {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/opts/removeholes.py +0 -0
  116. {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/opts/resize.py +0 -0
  117. {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/opts/shrinktoobjectcenters.py +0 -0
  118. {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/opts/smooth.py +0 -0
  119. {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/opts/structuring_elements.py +0 -0
  120. {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/opts/threshold.py +0 -0
  121. {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/py.typed +0 -0
  122. {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library_nightly.egg-info/dependency_links.txt +0 -0
  123. {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library_nightly.egg-info/requires.txt +0 -0
  124. {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library_nightly.egg-info/top_level.txt +0 -0
  125. {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/environment.yml +0 -0
  126. {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/pyproject.toml +0 -0
  127. {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cellprofiler-library-nightly
3
- Version: 5.0.0.dev661
3
+ Version: 5.0.0.dev674
4
4
  Summary: cellprofiler-library implements CellProfiler's image processing and mathematical code, and is usable as a standalone library
5
5
  Author: Anne Carpenter, Thouis (Ray) Jones, Lee Kamentsky, Vebjorn Ljosa, David Logan, Mark Bray, Madison Swain-Bowden, Allen Goodman, Claire McQuinn, Alice Lucas, Callum Tromans-Coia
6
6
  Author-email: Beth Cimini <bcimini@broadinstitute.org>, David Stirling <dstirling@glencoesoftware.com>, Nodar Gogoberidze <ngogober@broadinstitute.org>
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
18
18
  commit_id: str | None
19
19
  __commit_id__: str | None
20
20
 
21
- __version__ = version = '5.0.0.dev661'
22
- __version_tuple__ = version_tuple = (5, 0, 0, 'dev661')
21
+ __version__ = version = '5.0.0.dev674'
22
+ __version_tuple__ = version_tuple = (5, 0, 0, 'dev674')
23
23
 
24
- __commit_id__ = commit_id = 'g222155826'
24
+ __commit_id__ = commit_id = 'g70806405c'
@@ -8,6 +8,7 @@ from skimage.util import invert as _invert
8
8
  import skimage.transform
9
9
  import skimage
10
10
  import skimage.restoration
11
+ import skimage.exposure
11
12
  import centrosome
12
13
  import centrosome.threshold
13
14
  import centrosome.filter
@@ -23,6 +24,7 @@ from skimage.restoration import denoise_bilateral
23
24
  from centrosome.cpmorphology import get_line_pts, all_connected_components
24
25
  from scipy.ndimage import binary_erosion, binary_fill_holes
25
26
  from scipy.ndimage import mean as mean_of_labels
27
+ from skimage.feature import peak_local_max
26
28
  from scipy.fftpack import fft2, ifft2
27
29
  from cellprofiler_library.types import (
28
30
  ImageGrayscale, ImageGrayscaleMask,
@@ -31,7 +33,7 @@ from cellprofiler_library.types import (
31
33
  ImageAny, ImageAnyMask,
32
34
  ObjectSegmentation,
33
35
  Image2D, Image2DMask,
34
- StructuringElement, ObjectLabelSet, ImageColor, ImageBinaryMask, Image2DBinary, ObjectLabel, ImageBinary, Pixel
36
+ StructuringElement, ObjectLabelSet, ImageColor, ImageBinaryMask, Image2DBinary, ObjectLabel, ImageBinary, Pixel, PixelAny
35
37
  )
36
38
  from cellprofiler_library.opts import threshold as Threshold
37
39
  from cellprofiler_library.opts.enhanceorsuppressfeatures import SpeckleAccuracy, NeuriteMethod
@@ -42,7 +44,7 @@ from cellprofiler_library.opts.resize import ResizingMethod, DimensionMethod, In
42
44
  from cellprofiler_library.opts.imagemath import Operator
43
45
  from cellprofiler_library.opts.flipandrotate import RotationCoordinateAlignmnet
44
46
  from cellprofiler_library.opts.enhanceedges import EdgeDirection
45
-
47
+ from cellprofiler_library.opts.rescaleintensity import MaximumIntensityMethod, MinimumIntensityMethod
46
48
  invert = cast(Callable[[ImageAny], ImageAny], _invert)
47
49
  isscalar = cast(Callable[[Optional[ImageAny]], bool], _isscalar)
48
50
 
@@ -2870,3 +2872,240 @@ def reshape_image(
2870
2872
  result[: source.shape[0], : source.shape[1]] = source
2871
2873
  return result
2872
2874
 
2875
+
2876
+ ###############################################################################
2877
+ # RescaleIntensity
2878
+ ###############################################################################
2879
+
2880
+ def rescale(
2881
+ image_pixel_data: ImageAny,
2882
+ in_range: Tuple[float, float],
2883
+ out_range: Tuple[float, float] = (0.0, 1.0)
2884
+ ) -> ImageAny:
2885
+ data = 1.0 * image_pixel_data
2886
+
2887
+ rescaled = skimage.exposure.rescale_intensity(
2888
+ data, in_range=in_range, out_range=out_range
2889
+ )
2890
+
2891
+ return rescaled
2892
+
2893
+
2894
+ def stretch_rescale(
2895
+ data: ImageAny,
2896
+ mask: ImageAnyMask,
2897
+ multichannel: bool = False
2898
+ ) -> ImageAny:
2899
+ if multichannel:
2900
+ splitaxis = data.ndim - 1
2901
+ singlechannels = numpy.split(data, data.shape[-1], splitaxis)
2902
+ newchannels = []
2903
+ for channel in singlechannels:
2904
+ channel = numpy.squeeze(channel, axis=splitaxis)
2905
+ if (masked_channel := channel[mask]).size == 0:
2906
+ in_range = (0, 1)
2907
+ else:
2908
+ in_range = (min(masked_channel), max(masked_channel))
2909
+
2910
+ rescaled = rescale(channel, in_range)
2911
+
2912
+ newchannels.append(rescaled)
2913
+ full_rescaled = numpy.stack(newchannels, axis=-1)
2914
+ return full_rescaled
2915
+ if (masked_data := data[mask]).size == 0:
2916
+ in_range = (0, 1)
2917
+ else:
2918
+ in_range = (min(masked_data), max(masked_data))
2919
+ return rescale(data, in_range)
2920
+
2921
+
2922
+ def manual_input_range(
2923
+ data: ImageAny,
2924
+ mask: Optional[ImageAnyMask],
2925
+ source_high: float,
2926
+ source_low: float,
2927
+ source_scale_min: float,
2928
+ source_scale_max: float,
2929
+ auto_high: MaximumIntensityMethod,
2930
+ auto_low: MinimumIntensityMethod,
2931
+ global_min: Optional[PixelAny],
2932
+ global_max: Optional[PixelAny],
2933
+ ) -> ImageAny:
2934
+ return manual_io_range(
2935
+ data,
2936
+ mask,
2937
+ source_high,
2938
+ source_low,
2939
+ source_scale_min,
2940
+ source_scale_max,
2941
+ auto_high,
2942
+ auto_low,
2943
+ global_min,
2944
+ global_max
2945
+ )
2946
+
2947
+
2948
+ def manual_io_range(
2949
+ data: ImageAny,
2950
+ mask: Optional[ImageAnyMask],
2951
+ source_high: float,
2952
+ source_low: float,
2953
+ source_scale_min: float,
2954
+ source_scale_max: float,
2955
+ auto_high: MaximumIntensityMethod,
2956
+ auto_low: MinimumIntensityMethod,
2957
+ global_min: Optional[PixelAny],
2958
+ global_max: Optional[PixelAny],
2959
+ dest_scale_min: Optional[float]=None,
2960
+ dest_scale_max: Optional[float]=None
2961
+ ) -> ImageAny:
2962
+ in_range = get_source_range(data, mask, source_high, source_low, source_scale_min, source_scale_max, auto_high, auto_low, global_min, global_max)
2963
+ if dest_scale_min is None and dest_scale_max is None:
2964
+ return rescale(data, in_range)
2965
+ else:
2966
+ out_range = (dest_scale_min, dest_scale_max)
2967
+ return rescale(data, in_range, out_range)
2968
+
2969
+
2970
+ def divide(data: ImageAny, value: float) -> ImageAny:
2971
+ if value == 0.0:
2972
+ raise ZeroDivisionError("Cannot divide pixel intensity by 0.")
2973
+
2974
+ return data / value
2975
+
2976
+
2977
+ def divide_by_image_minimum(data: ImageAny, mask: ImageAnyMask) -> ImageAny:
2978
+ if (masked_data := data[mask]).size == 0:
2979
+ src_min = numpy.float64(0)
2980
+ else:
2981
+ src_min = numpy.min(masked_data)
2982
+
2983
+ return divide(data, float(src_min))
2984
+
2985
+
2986
+ def divide_by_image_maximum(data: ImageAny, mask: ImageAnyMask) -> ImageAny:
2987
+ if (masked_data := data[mask]).size == 0:
2988
+ src_max = numpy.float64(1)
2989
+ else:
2990
+ src_max = numpy.max(masked_data)
2991
+
2992
+ return divide(data, float(src_max))
2993
+
2994
+
2995
+ def divide_by_value(data: ImageAny, divisor_value: float):
2996
+ return divide(data, divisor_value)
2997
+
2998
+
2999
+ def scale_by_image_maximum(
3000
+ data: ImageAny,
3001
+ mask: ImageAnyMask,
3002
+ reference_data: ImageAny,
3003
+ reference_mask: ImageGrayscaleMask
3004
+ ) -> ImageAny:
3005
+ ###
3006
+ # Scale the image by the maximum of another image
3007
+ #
3008
+ # Find the maximum value within the unmasked region of the input
3009
+ # and reference image. Multiply by the reference maximum, divide
3010
+ # by the input maximum to scale the input image to the same
3011
+ # range as the reference image
3012
+ ###
3013
+ if (masked_input := data[mask]).size == 0:
3014
+ return data
3015
+ else:
3016
+ image_max = numpy.max(masked_input)
3017
+
3018
+ if image_max == 0:
3019
+ return data
3020
+
3021
+
3022
+ if (masked_ref := reference_data[reference_mask]).size == 0:
3023
+ reference_max = 1
3024
+ else:
3025
+ reference_max = numpy.max(masked_ref)
3026
+
3027
+ return divide(data * reference_max, float(image_max))
3028
+
3029
+
3030
+ def get_source_range(
3031
+ data: ImageAny,
3032
+ mask: Optional[ImageAnyMask],
3033
+ source_high: float,
3034
+ source_low: float,
3035
+ source_scale_min: float,
3036
+ source_scale_max: float,
3037
+ auto_high: MaximumIntensityMethod,
3038
+ auto_low: MinimumIntensityMethod,
3039
+ global_min: Optional[PixelAny],
3040
+ global_max: Optional[PixelAny],
3041
+ ) -> Tuple[float, float]:
3042
+ """Get the source range, accounting for automatically computed values"""
3043
+ input_pixels = None
3044
+ if (
3045
+ auto_high == MaximumIntensityMethod.CUSTOM_VALUE.value
3046
+ and auto_low == MinimumIntensityMethod.CUSTOM_VALUE.value
3047
+ ):
3048
+ return source_scale_min, source_scale_max
3049
+
3050
+ if (
3051
+ auto_low == MinimumIntensityMethod.EACH_IMAGE.value
3052
+ or auto_high == MaximumIntensityMethod.EACH_IMAGE.value
3053
+ ):
3054
+ input_pixels = data
3055
+ if mask is not None:
3056
+ input_pixels = input_pixels[mask]
3057
+ if input_pixels.size == 0:
3058
+ return 0, 1
3059
+
3060
+ if auto_low == MinimumIntensityMethod.ALL_IMAGES.value:
3061
+ src_min = float(global_min or 0)
3062
+ elif auto_low == MinimumIntensityMethod.EACH_IMAGE.value:
3063
+ assert input_pixels is not None, "Invalid settings for automatic minimum, please check your settings and data"
3064
+ src_min = float(numpy.min(input_pixels))
3065
+ else:
3066
+ src_min = source_low
3067
+
3068
+ if auto_high == MaximumIntensityMethod.ALL_IMAGES.value:
3069
+ src_max = float(global_max or 0)
3070
+ elif auto_high == MaximumIntensityMethod.EACH_IMAGE.value:
3071
+ assert input_pixels is not None, "Invalid settings for automatic maximum, please check your settings and data"
3072
+ src_max = float(numpy.max(input_pixels))
3073
+ else:
3074
+ src_max = source_high
3075
+
3076
+ return src_min, src_max
3077
+
3078
+ ################################################################################
3079
+ # FindMaxima
3080
+ ################################################################################
3081
+
3082
+ def find_maxima_in_data(
3083
+ x_data: ImageAny,
3084
+ min_distance_value: int,
3085
+ label_maxima: bool,
3086
+ th_abs: Optional[float]=None
3087
+ ) -> Union[ImageBinary, ObjectSegmentation]:
3088
+ maxima_coords = peak_local_max(
3089
+ x_data,
3090
+ min_distance=min_distance_value,
3091
+ threshold_abs=th_abs,
3092
+ )
3093
+ y_data = numpy.zeros(x_data.shape, dtype=bool)
3094
+ y_data[tuple(maxima_coords.T)] = True
3095
+
3096
+ if label_maxima:
3097
+ y_data = scipy.ndimage.label(y_data)[0]
3098
+ return y_data
3099
+
3100
+ def find_maxima_threshold(x_data: ImageAny) -> ImageAny:
3101
+ """Identity function, just returns the input"""
3102
+ return x_data
3103
+
3104
+ def apply_target_mask(x_data: ImageAny, masking_image: Union[ImageAny,ObjectSegmentation]) -> ImageAny:
3105
+ mask = masking_image.astype(bool)
3106
+ x_data[~mask] = 0
3107
+ return x_data
3108
+
3109
+
3110
+
3111
+
@@ -0,0 +1,31 @@
1
+ import scipy.ndimage
2
+ from typing import Optional, Annotated, Union
3
+ from pydantic import validate_call, ConfigDict, Field
4
+ from cellprofiler_library.types import ImageAny, ObjectSegmentation, ImageBinary
5
+ from cellprofiler_library.opts.findmaxima import BackgroundExclusionMode
6
+ from cellprofiler_library.functions.image_processing import find_maxima_in_data, find_maxima_threshold, apply_target_mask
7
+
8
+ @validate_call(config=ConfigDict(arbitrary_types_allowed=True))
9
+ def find_maxima(
10
+ x_data: Annotated[ImageAny, Field(description="Input image to search for maxima")],
11
+ exclude_mode: Annotated[BackgroundExclusionMode, Field(description="Method for excluding background")],
12
+ min_distance_value: Annotated[int, Field(description="Minimum distance between maxima")], #Minimum distance between maxima
13
+ label_maxima: Annotated[bool, Field(description="Individually label maxima?")],
14
+ min_intensity_value: Annotated[Optional[float], Field(description="Specify the minimum intensity of a peak")],
15
+ target_mask: Annotated[Optional[Union[ImageAny,ObjectSegmentation]], Field(description="The image or objects to search within")],
16
+ ) -> Union[ImageBinary, ObjectSegmentation]:
17
+ th_abs = min_intensity_value
18
+
19
+ if exclude_mode.value == BackgroundExclusionMode.THRESHOLD.value:
20
+ x_data = find_maxima_threshold(x_data)
21
+ elif exclude_mode.value == BackgroundExclusionMode.MASK.value:
22
+ assert target_mask is not None, "Mask image is required for mask mode"
23
+ x_data = apply_target_mask(x_data, target_mask)
24
+ elif exclude_mode.value == BackgroundExclusionMode.OBJECTS.value:
25
+ assert target_mask is not None, "Objects are required for within objects mode"
26
+ x_data = apply_target_mask(x_data, target_mask)
27
+ else:
28
+ raise NotImplementedError("Invalid background method choice")
29
+
30
+ return find_maxima_in_data(x_data, min_distance_value, label_maxima, th_abs)
31
+
@@ -0,0 +1,60 @@
1
+ from typing import Optional, Annotated
2
+ from pydantic import validate_call, ConfigDict, Field
3
+ from cellprofiler_library.opts.rescaleintensity import RescaleMethod, MinimumIntensityMethod, MaximumIntensityMethod
4
+ from cellprofiler_library.types import ImageAny, ImageAnyMask, ImageGrayscaleMask, PixelAny
5
+ from cellprofiler_library.functions.image_processing import stretch_rescale, manual_input_range, manual_io_range, divide_by_image_maximum, divide_by_image_minimum, divide_by_value, scale_by_image_maximum
6
+
7
+ @validate_call(config=ConfigDict(arbitrary_types_allowed=True))
8
+ def rescale_intensity(
9
+ rescale_method: Annotated[RescaleMethod, Field(description="Method to rescale the image")],
10
+ in_pixel_data: Annotated[ImageAny, Field(description="Input image data")],
11
+ in_mask: Annotated[ImageAnyMask, Field(description="Input image mask")],
12
+ input_image_has_mask: Annotated[bool, Field(description="Whether the input image has a mask")],
13
+ in_multichannel: Annotated[bool, Field(description="Whether the input image is multichannel")],
14
+ divisor_value: Annotated[float, Field(description="Value to divide the input image by (for divide by value)")],
15
+ auto_high: Annotated[MaximumIntensityMethod, Field(description="Method to determine the maximum intensity")],
16
+ auto_low: Annotated[MinimumIntensityMethod, Field(description="Method to determine the minimum intensity")],
17
+ source_high: Annotated[float, Field(description="Upper intensity limit for the input image")],
18
+ source_low: Annotated[float, Field(description="Lower intensity limit for the input image")],
19
+ source_scale_min: Annotated[float, Field(description="Intensity range for the input image - minimum")],
20
+ source_scale_max: Annotated[float, Field(description="Intensity range for the input image - maximum")],
21
+ global_min: Annotated[Optional[PixelAny], Field(description="Intensity range for all images - minimum")],
22
+ global_max: Annotated[Optional[PixelAny], Field(description="Intensity range for all images = maximum")],
23
+ dest_scale_min: Annotated[Optional[float], Field(description="Intensity range for the output image - minimum")],
24
+ dest_scale_max: Annotated[Optional[float], Field(description="Intensity range for the output image - maximum")],
25
+ reference_image_pixel_data: Annotated[Optional[ImageAny], Field(description="Reference image data - for scale by image maximum")],
26
+ reference_image_mask: Annotated[Optional[ImageGrayscaleMask], Field(description="Reference image mask - for scale by image maximum")],
27
+ ) -> ImageAny:
28
+ if rescale_method == RescaleMethod.STRETCH.value:
29
+ output_image = stretch_rescale(in_pixel_data, in_mask, in_multichannel)
30
+ elif (rescale_method == RescaleMethod.MANUAL_INPUT_RANGE.value) or (rescale_method == RescaleMethod.MANUAL_IO_RANGE.value):
31
+ in_mask_manual_input = None if input_image_has_mask else in_mask # for this method, mask needs to be None if not present
32
+ if rescale_method == RescaleMethod.MANUAL_INPUT_RANGE.value:
33
+ output_image = manual_input_range(
34
+ in_pixel_data,
35
+ in_mask_manual_input,
36
+ source_high, source_low, source_scale_min, source_scale_max, auto_high, auto_low, global_min, global_max
37
+ )
38
+ else:
39
+ output_image = manual_io_range(
40
+ in_pixel_data,
41
+ in_mask_manual_input,
42
+ source_high, source_low, source_scale_min, source_scale_max, auto_high, auto_low, global_min, global_max, dest_scale_min, dest_scale_max
43
+ )
44
+ elif rescale_method == RescaleMethod.DIVIDE_BY_IMAGE_MINIMUM.value:
45
+ output_image = divide_by_image_minimum(in_pixel_data, in_mask)
46
+ elif rescale_method == RescaleMethod.DIVIDE_BY_IMAGE_MAXIMUM.value:
47
+ output_image = divide_by_image_maximum(in_pixel_data, in_mask)
48
+ elif rescale_method == RescaleMethod.DIVIDE_BY_VALUE.value:
49
+ output_image = divide_by_value(in_pixel_data, divisor_value)
50
+ elif rescale_method == RescaleMethod.DIVIDE_BY_MEASUREMENT.value:
51
+ # TODO: 5088 - update this once measurement format is finalized
52
+ raise NotImplementedError("Rescale by measurement not implemented in library yet")
53
+ elif rescale_method == RescaleMethod.SCALE_BY_IMAGE_MAXIMUM.value:
54
+ assert reference_image_pixel_data is not None, "Reference image is required for scale by image maximum"
55
+ assert reference_image_mask is not None, "Reference image mask is required for scale by image maximum"
56
+ output_image = scale_by_image_maximum(in_pixel_data, in_mask, reference_image_pixel_data, reference_image_mask)
57
+ else:
58
+ raise ValueError(f"Invalid rescale method: {rescale_method.value}")
59
+ return output_image
60
+
@@ -0,0 +1,7 @@
1
+ from enum import Enum
2
+
3
+ class BackgroundExclusionMode(str, Enum):
4
+ """Background exclusion method"""
5
+ THRESHOLD = "Threshold"
6
+ MASK = "Mask"
7
+ OBJECTS = "Within Objects"
@@ -0,0 +1,39 @@
1
+ from enum import Enum
2
+
3
+ class RescaleMethod(str, Enum):
4
+
5
+ STRETCH = "Stretch each image to use the full intensity range"
6
+ MANUAL_INPUT_RANGE = "Choose specific values to be reset to the full intensity range"
7
+ MANUAL_IO_RANGE = "Choose specific values to be reset to a custom range"
8
+ DIVIDE_BY_IMAGE_MINIMUM = "Divide by the image's minimum"
9
+ DIVIDE_BY_IMAGE_MAXIMUM = "Divide by the image's maximum"
10
+ DIVIDE_BY_VALUE = "Divide each image by the same value"
11
+ DIVIDE_BY_MEASUREMENT = "Divide each image by a previously calculated value"
12
+ SCALE_BY_IMAGE_MAXIMUM = "Match the image's maximum to another image's maximum"
13
+
14
+ M_ALL = [
15
+ RescaleMethod.STRETCH,
16
+ RescaleMethod.MANUAL_INPUT_RANGE,
17
+ RescaleMethod.MANUAL_IO_RANGE,
18
+ RescaleMethod.DIVIDE_BY_IMAGE_MINIMUM,
19
+ RescaleMethod.DIVIDE_BY_IMAGE_MAXIMUM,
20
+ RescaleMethod.DIVIDE_BY_VALUE,
21
+ RescaleMethod.DIVIDE_BY_MEASUREMENT,
22
+ RescaleMethod.SCALE_BY_IMAGE_MAXIMUM,
23
+ ]
24
+
25
+ _CUSTOM_VALUE = "Custom"
26
+
27
+ class MinimumIntensityMethod(str, Enum):
28
+ CUSTOM_VALUE = _CUSTOM_VALUE
29
+ ALL_IMAGES = "Minimum of all images"
30
+ EACH_IMAGE = "Minimum for each image"
31
+
32
+ LOW_ALL = [MinimumIntensityMethod.CUSTOM_VALUE, MinimumIntensityMethod.EACH_IMAGE, MinimumIntensityMethod.ALL_IMAGES]
33
+
34
+ class MaximumIntensityMethod(str, Enum):
35
+ CUSTOM_VALUE = _CUSTOM_VALUE
36
+ ALL_IMAGES = "Maximum of all images"
37
+ EACH_IMAGE = "Maximum for each image"
38
+
39
+ HIGH_ALL = [MaximumIntensityMethod.CUSTOM_VALUE, MaximumIntensityMethod.EACH_IMAGE, MaximumIntensityMethod.ALL_IMAGES]
@@ -82,25 +82,34 @@ def validate_object_segmentation_ijv(ijv: NDArray[np.int_]) -> NDArray[np.int_]:
82
82
  raise ValueError(f"Expected a 2-dimensional array with 3 columns, got {ijv.shape[1]}")
83
83
  return ijv
84
84
 
85
+ PixelAny_ = Union[np.float32, np.float64, np.int_, np.int8, np.int16, np.int32, np.uint8, np.uint16, np.uint32, np.bool_]
86
+ PixelAny = Annotated[PixelAny_, Field(description="Pixel value, before conversion to float")]
87
+ Pixel_ = Union[np.float32, np.float64]
85
88
  Pixel = Annotated[Union[np.float32, np.float64], Field(description="Pixel value")]
86
89
  ObjectLabel = Annotated[Union[np.int8, np.int16, np.int32], Field(description="Object label")]
87
90
  ObjectIndices = Annotated[np.int32, Field(description="Object indices")]
88
91
 
89
- Image2DColor = Annotated[NDArray[Pixel], Field(description="2D image with multiple channels of type float32"), AfterValidator(create_type_validator(False, True, False, Union[np.float32, np.float64]))]
92
+ Image2DColor = Annotated[NDArray[Pixel], Field(description="2D image with multiple channels of type float32"), AfterValidator(create_type_validator(False, True, False, Pixel_))]
93
+ Image2DColorAny = Annotated[NDArray[PixelAny], Field(description="2D image with multiple channels of any type"), AfterValidator(create_type_validator(False, True, False, PixelAny_))]
90
94
  Image2DColorMask = Annotated[NDArray[np.bool_], Field(description="2D color mask"), AfterValidator(create_type_validator(False, True, False, np.bool_))]
91
- Image2DGrayscale = Annotated[NDArray[Pixel], Field(description="2D grayscale image of type float32"), AfterValidator(create_type_validator(False, False, False, Union[np.float32, np.float64]))]
95
+ Image2DGrayscale = Annotated[NDArray[Pixel], Field(description="2D grayscale image of type float32"), AfterValidator(create_type_validator(False, False, False, Pixel_))]
96
+ Image2DGrayscaleAny = Annotated[NDArray[PixelAny], Field(description="2D grayscale image of any type"), AfterValidator(create_type_validator(False, False, False, PixelAny_))]
92
97
  Image2DGrayscaleMask = Annotated[NDArray[np.bool_], Field(description="2D grayscale mask"), AfterValidator(create_type_validator(False, False, False, np.bool_))]
93
98
  Image2DBinary = Annotated[NDArray[np.bool_], Field(description="2D binary image"), AfterValidator(create_type_validator(False, False, False, np.bool_))]
94
99
  Image2DBinaryMask = Annotated[NDArray[np.bool_], Field(description="2D binary mask"), AfterValidator(create_type_validator(False, False, False, np.bool_))]
95
100
  Image2DInt = Annotated[NDArray[np.int32], Field(description="2D int32 image"), AfterValidator(create_type_validator(False, False, False, np.int32))]
101
+ Image2DUInt = Annotated[NDArray[np.uint8], Field(description="2D uint8 image"), AfterValidator(create_type_validator(False, False, False, np.uint8))]
96
102
 
97
- Image3DColor = Annotated[NDArray[Pixel], Field(description="3D image with multiple channels of type float32"), AfterValidator(create_type_validator(True, True, False, Union[np.float32, np.float64]))]
103
+ Image3DColor = Annotated[NDArray[Pixel], Field(description="3D image with multiple channels of type float32"), AfterValidator(create_type_validator(True, True, False, Pixel_))]
104
+ Image3DColorAny = Annotated[NDArray[PixelAny], Field(description="3D image with multiple channels of any type"), AfterValidator(create_type_validator(True, True, False, PixelAny_))]
98
105
  Image3DColorMask = Annotated[NDArray[np.bool_], Field(description="3D image with multiple channels of type float32"), AfterValidator(create_type_validator(True, True, False, np.bool_))]
99
- Image3DGrayscale = Annotated[NDArray[Pixel], Field(description="3D grayscale image of type float32"), AfterValidator(create_type_validator(True, False, False, Union[np.float32, np.float64]))]
106
+ Image3DGrayscale = Annotated[NDArray[Pixel], Field(description="3D grayscale image of type float32"), AfterValidator(create_type_validator(True, False, False, Pixel_))]
107
+ Image3DGrayscaleAny = Annotated[NDArray[PixelAny], Field(description="3D grayscale image of any type"), AfterValidator(create_type_validator(True, False, False, PixelAny_))]
100
108
  Image3DGrayscaleMask = Annotated[NDArray[np.bool_], Field(description="3D grayscale mask"), AfterValidator(create_type_validator(True, False, False, np.bool_))]
101
109
  Image3DBinary = Annotated[NDArray[np.bool_], Field(description="3D binary image"), AfterValidator(create_type_validator(True, False, False, np.bool_))]
102
110
  Image3DBinaryMask = Annotated[NDArray[np.bool_], Field(description="3D binary mask"), AfterValidator(create_type_validator(True, False, False, np.bool_))]
103
111
  Image3DInt = Annotated[NDArray[np.int32], Field(description="3D int32 image"), AfterValidator(create_type_validator(True, False, False, np.int32))]
112
+ Image3DUInt = Annotated[NDArray[np.uint8], Field(description="3D uint8 image"), AfterValidator(create_type_validator(True, False, False, np.uint8))]
104
113
 
105
114
  # see cellprofiler_library.functions.segmentation._validate_<type> for more details
106
115
  ObjectLabelsDense = Annotated[NDArray[ObjectLabel], Field(description="Dense array of object labels"), AfterValidator(validate_object_labels_dense)]
@@ -118,7 +127,7 @@ ImageColorMask = Union[Image2DColorMask, Image3DColorMask]
118
127
  ImageBinary = Union[Image2DBinary, Image3DBinary]
119
128
  ImageBinaryMask = Union[Image2DBinaryMask, Image3DBinaryMask]
120
129
 
121
- ImageAny = Union[Image2DColor, Image3DColor, Image2DGrayscale, Image3DGrayscale, Image2DBinary, Image3DBinary, Image2DInt, Image3DInt]
130
+ ImageAny = Union[Image2DColorAny, Image3DColorAny, Image2DGrayscaleAny, Image3DGrayscaleAny, Image2DBinary, Image3DBinary, Image2DInt, Image3DInt]
122
131
  ImageAnyMask = Union[Image2DColorMask, Image3DColorMask, Image2DGrayscaleMask, Image3DGrayscaleMask, Image2DBinaryMask, Image3DBinaryMask]
123
132
 
124
133
  Image2D = Union[Image2DColor, Image2DGrayscale, Image2DBinary]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cellprofiler-library-nightly
3
- Version: 5.0.0.dev661
3
+ Version: 5.0.0.dev674
4
4
  Summary: cellprofiler-library implements CellProfiler's image processing and mathematical code, and is usable as a standalone library
5
5
  Author: Anne Carpenter, Thouis (Ray) Jones, Lee Kamentsky, Vebjorn Ljosa, David Logan, Mark Bray, Madison Swain-Bowden, Allen Goodman, Claire McQuinn, Alice Lucas, Callum Tromans-Coia
6
6
  Author-email: Beth Cimini <bcimini@broadinstitute.org>, David Stirling <dstirling@glencoesoftware.com>, Nodar Gogoberidze <ngogober@broadinstitute.org>
@@ -31,6 +31,7 @@ cellprofiler_library/modules/_erodeobjects.py
31
31
  cellprofiler_library/modules/_expandorshrinkobjects.py
32
32
  cellprofiler_library/modules/_fillobjects.py
33
33
  cellprofiler_library/modules/_filterobjects.py
34
+ cellprofiler_library/modules/_findmaxima.py
34
35
  cellprofiler_library/modules/_flipandrotate.py
35
36
  cellprofiler_library/modules/_gaussianfilter.py
36
37
  cellprofiler_library/modules/_graytocolor.py
@@ -62,6 +63,7 @@ cellprofiler_library/modules/_overlayobjects.py
62
63
  cellprofiler_library/modules/_overlayoutlines.py
63
64
  cellprofiler_library/modules/_reducenoise.py
64
65
  cellprofiler_library/modules/_removeholes.py
66
+ cellprofiler_library/modules/_rescaleintensity.py
65
67
  cellprofiler_library/modules/_resize.py
66
68
  cellprofiler_library/modules/_savecroppedobjects.py
67
69
  cellprofiler_library/modules/_shrinktoobjectcenters.py
@@ -82,6 +84,7 @@ cellprofiler_library/opts/enhanceorsuppressfeatures.py
82
84
  cellprofiler_library/opts/erodeimage.py
83
85
  cellprofiler_library/opts/erodeobjects.py
84
86
  cellprofiler_library/opts/filterobjects.py
87
+ cellprofiler_library/opts/findmaxima.py
85
88
  cellprofiler_library/opts/flipandrotate.py
86
89
  cellprofiler_library/opts/graytocolor.py
87
90
  cellprofiler_library/opts/identifydeadworms.py
@@ -106,6 +109,7 @@ cellprofiler_library/opts/morph.py
106
109
  cellprofiler_library/opts/objectsizeshapefeatures.py
107
110
  cellprofiler_library/opts/overlayoutlines.py
108
111
  cellprofiler_library/opts/removeholes.py
112
+ cellprofiler_library/opts/rescaleintensity.py
109
113
  cellprofiler_library/opts/resize.py
110
114
  cellprofiler_library/opts/shrinktoobjectcenters.py
111
115
  cellprofiler_library/opts/smooth.py
@@ -28,6 +28,7 @@
28
28
  "cellprofiler_library/modules/_expandorshrinkobjects.py",
29
29
  "cellprofiler_library/modules/_fillobjects.py",
30
30
  "cellprofiler_library/modules/_filterobjects.py",
31
+ "cellprofiler_library/modules/_findmaxima.py",
31
32
  "cellprofiler_library/modules/_flipandrotate.py",
32
33
  "cellprofiler_library/modules/_gaussianfilter.py",
33
34
  "cellprofiler_library/modules/_graytocolor.py",
@@ -59,6 +60,7 @@
59
60
  "cellprofiler_library/modules/_overlayoutlines.py",
60
61
  "cellprofiler_library/modules/_reducenoise.py",
61
62
  "cellprofiler_library/modules/_removeholes.py",
63
+ "cellprofiler_library/modules/_rescaleintensity.py",
62
64
  "cellprofiler_library/modules/_resize.py",
63
65
  "cellprofiler_library/modules/_savecroppedobjects.py",
64
66
  "cellprofiler_library/modules/_shrinktoobjectcenters.py",
@@ -79,6 +81,7 @@
79
81
  "cellprofiler_library/opts/erodeimage.py",
80
82
  "cellprofiler_library/opts/erodeobjects.py",
81
83
  "cellprofiler_library/opts/filterobjects.py",
84
+ "cellprofiler_library/opts/findmaxima.py",
82
85
  "cellprofiler_library/opts/flipandrotate.py",
83
86
  "cellprofiler_library/opts/graytocolor.py",
84
87
  "cellprofiler_library/opts/identifydeadworms.py",
@@ -103,6 +106,7 @@
103
106
  "cellprofiler_library/opts/objectsizeshapefeatures.py",
104
107
  "cellprofiler_library/opts/overlayoutlines.py",
105
108
  "cellprofiler_library/opts/removeholes.py",
109
+ "cellprofiler_library/opts/rescaleintensity.py",
106
110
  "cellprofiler_library/opts/resize.py",
107
111
  "cellprofiler_library/opts/shrinktoobjectcenters.py",
108
112
  "cellprofiler_library/opts/smooth.py",
@@ -0,0 +1,8 @@
1
+ {
2
+ "tag": "5.0.0.dev0",
3
+ "distance": 674,
4
+ "node": "g70806405c22aad5d5e470413232c1491aac2661d",
5
+ "dirty": true,
6
+ "branch": "main",
7
+ "node_date": "2026-08-24"
8
+ }
@@ -1,8 +0,0 @@
1
- {
2
- "tag": "5.0.0.dev0",
3
- "distance": 661,
4
- "node": "g222155826b53073e015588d1def75edb54970ad2",
5
- "dirty": true,
6
- "branch": "main",
7
- "node_date": "2026-08-19"
8
- }