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.
- {cellprofiler_library_nightly-5.0.0.dev661/cellprofiler_library_nightly.egg-info → cellprofiler_library_nightly-5.0.0.dev674}/PKG-INFO +1 -1
- {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/_version.py +3 -3
- {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/functions/image_processing.py +241 -2
- cellprofiler_library_nightly-5.0.0.dev674/cellprofiler_library/modules/_findmaxima.py +31 -0
- cellprofiler_library_nightly-5.0.0.dev674/cellprofiler_library/modules/_rescaleintensity.py +60 -0
- cellprofiler_library_nightly-5.0.0.dev674/cellprofiler_library/opts/findmaxima.py +7 -0
- cellprofiler_library_nightly-5.0.0.dev674/cellprofiler_library/opts/rescaleintensity.py +39 -0
- {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/types.py +14 -5
- {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674/cellprofiler_library_nightly.egg-info}/PKG-INFO +1 -1
- {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library_nightly.egg-info/SOURCES.txt +4 -0
- {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
- cellprofiler_library_nightly-5.0.0.dev674/cellprofiler_library_nightly.egg-info/scm_version.json +8 -0
- cellprofiler_library_nightly-5.0.0.dev661/cellprofiler_library_nightly.egg-info/scm_version.json +0 -8
- {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/LICENSE +0 -0
- {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/README.md +0 -0
- {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/__init__.py +0 -0
- {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/functions/__init__.py +0 -0
- {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/functions/file_processing.py +0 -0
- {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/functions/measurement.py +0 -0
- {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/functions/object_processing.py +0 -0
- {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/functions/segmentation.py +0 -0
- {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/measurement_model.py +0 -0
- {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/modules/__init__.py +0 -0
- {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/modules/_align.py +0 -0
- {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/modules/_closing.py +0 -0
- {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/modules/_colortogray.py +0 -0
- {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/modules/_combineobjects.py +0 -0
- {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/modules/_convertimagetoobjects.py +0 -0
- {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/modules/_convertobjectstoimage.py +0 -0
- {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/modules/_correctilluminationapply.py +0 -0
- {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/modules/_crop.py +0 -0
- {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/modules/_dilateimage.py +0 -0
- {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/modules/_dilateobjects.py +0 -0
- {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/modules/_enhanceedges.py +0 -0
- {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/modules/_enhanceorsuppressfeatures.py +0 -0
- {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/modules/_erodeimage.py +0 -0
- {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/modules/_erodeobjects.py +0 -0
- {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/modules/_expandorshrinkobjects.py +0 -0
- {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/modules/_fillobjects.py +0 -0
- {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/modules/_filterobjects.py +0 -0
- {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/modules/_flipandrotate.py +0 -0
- {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/modules/_gaussianfilter.py +0 -0
- {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/modules/_graytocolor.py +0 -0
- {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/modules/_identifydeadworms.py +0 -0
- {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/modules/_identifyprimaryobjects.py +0 -0
- {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/modules/_identifysecondaryobjects.py +0 -0
- {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/modules/_identifytertiaryobjects.py +0 -0
- {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/modules/_imagemath.py +0 -0
- {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/modules/_measurecolocalization.py +0 -0
- {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/modules/_measuregranularity.py +0 -0
- {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/modules/_measureimageareaoccupied.py +0 -0
- {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/modules/_measureimageintensity.py +0 -0
- {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/modules/_measureimageoverlap.py +0 -0
- {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/modules/_measureimagequality.py +0 -0
- {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/modules/_measureimageskeleton.py +0 -0
- {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/modules/_measureobjectintensity.py +0 -0
- {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/modules/_measureobjectintensitydistribution.py +0 -0
- {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/modules/_measureobjectneighbors.py +0 -0
- {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/modules/_measureobjectoverlap.py +0 -0
- {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/modules/_measureobjectsizeshape.py +0 -0
- {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/modules/_measureobjectskeleton.py +0 -0
- {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/modules/_measuretexture.py +0 -0
- {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/modules/_medialaxis.py +0 -0
- {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/modules/_medianfilter.py +0 -0
- {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/modules/_morph.py +0 -0
- {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/modules/_morphologicalskeleton.py +0 -0
- {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/modules/_opening.py +0 -0
- {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/modules/_overlayobjects.py +0 -0
- {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/modules/_overlayoutlines.py +0 -0
- {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/modules/_reducenoise.py +0 -0
- {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/modules/_removeholes.py +0 -0
- {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/modules/_resize.py +0 -0
- {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/modules/_savecroppedobjects.py +0 -0
- {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/modules/_shrinktoobjectcenters.py +0 -0
- {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/modules/_smooth.py +0 -0
- {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/modules/_threshold.py +0 -0
- {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/modules/_watershed.py +0 -0
- {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/opts/__init__.py +0 -0
- {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/opts/align.py +0 -0
- {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/opts/colortogray.py +0 -0
- {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/opts/convertimagetoobjects.py +0 -0
- {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/opts/convertobjectstoimage.py +0 -0
- {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/opts/correctilluminationapply.py +0 -0
- {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/opts/crop.py +0 -0
- {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/opts/dilateimage.py +0 -0
- {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/opts/dilateobjects.py +0 -0
- {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/opts/enhanceedges.py +0 -0
- {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/opts/enhanceorsuppressfeatures.py +0 -0
- {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/opts/erodeimage.py +0 -0
- {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/opts/erodeobjects.py +0 -0
- {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/opts/filterobjects.py +0 -0
- {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/opts/flipandrotate.py +0 -0
- {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/opts/graytocolor.py +0 -0
- {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/opts/identifydeadworms.py +0 -0
- {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/opts/identifyprimaryobjects.py +0 -0
- {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/opts/identifysecondaryobjects.py +0 -0
- {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/opts/identifytertiaryobjects.py +0 -0
- {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/opts/imagemath.py +0 -0
- {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/opts/measurecolocalization.py +0 -0
- {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/opts/measuregranularity.py +0 -0
- {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/opts/measureimageareaoccupied.py +0 -0
- {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/opts/measureimageintensity.py +0 -0
- {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/opts/measureimageoverlap.py +0 -0
- {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/opts/measureimagequality.py +0 -0
- {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/opts/measureimageskeleton.py +0 -0
- {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/opts/measureobjectintensity.py +0 -0
- {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/opts/measureobjectintensitydistribution.py +0 -0
- {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/opts/measureobjectneighbors.py +0 -0
- {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/opts/measureobjectoverlap.py +0 -0
- {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/opts/measureobjectskeleton.py +0 -0
- {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/opts/measuretexture.py +0 -0
- {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/opts/morph.py +0 -0
- {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/opts/objectsizeshapefeatures.py +0 -0
- {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/opts/overlayoutlines.py +0 -0
- {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/opts/removeholes.py +0 -0
- {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/opts/resize.py +0 -0
- {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/opts/shrinktoobjectcenters.py +0 -0
- {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/opts/smooth.py +0 -0
- {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/opts/structuring_elements.py +0 -0
- {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/opts/threshold.py +0 -0
- {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library/py.typed +0 -0
- {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library_nightly.egg-info/dependency_links.txt +0 -0
- {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library_nightly.egg-info/requires.txt +0 -0
- {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/cellprofiler_library_nightly.egg-info/top_level.txt +0 -0
- {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/environment.yml +0 -0
- {cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/pyproject.toml +0 -0
- {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.
|
|
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.
|
|
22
|
-
__version_tuple__ = version_tuple = (5, 0, 0, '
|
|
21
|
+
__version__ = version = '5.0.0.dev674'
|
|
22
|
+
__version_tuple__ = version_tuple = (5, 0, 0, 'dev674')
|
|
23
23
|
|
|
24
|
-
__commit_id__ = commit_id = '
|
|
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,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,
|
|
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,
|
|
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,
|
|
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,
|
|
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[
|
|
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.
|
|
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",
|
{cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/LICENSE
RENAMED
|
File without changes
|
{cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/README.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{cellprofiler_library_nightly-5.0.0.dev661 → cellprofiler_library_nightly-5.0.0.dev674}/setup.cfg
RENAMED
|
File without changes
|