cellprofiler-library-nightly 5.0.0.dev313__py3-none-any.whl → 5.0.0.dev321__py3-none-any.whl

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.
@@ -28,7 +28,7 @@ version_tuple: VERSION_TUPLE
28
28
  commit_id: COMMIT_ID
29
29
  __commit_id__: COMMIT_ID
30
30
 
31
- __version__ = version = '5.0.0.dev313'
32
- __version_tuple__ = version_tuple = (5, 0, 0, 'dev313')
31
+ __version__ = version = '5.0.0.dev321'
32
+ __version_tuple__ = version_tuple = (5, 0, 0, 'dev321')
33
33
 
34
34
  __commit_id__ = commit_id = None
@@ -5,10 +5,11 @@ import centrosome
5
5
  import centrosome.threshold
6
6
  import scipy
7
7
  import matplotlib
8
+ import math
8
9
  from typing import Any, Optional, Tuple, Callable, Union, List
9
- from ..types import ImageGrayscale, ImageGrayscaleMask, Image2DColor, Image2DGrayscale, ImageAny, ObjectSegmentation
10
- from ..opts import threshold as Threshold
11
-
10
+ from cellprofiler_library.types import ImageGrayscale, ImageGrayscaleMask, Image2DColor, Image2DGrayscale, ImageAny, ObjectSegmentation, Image2D, Image2DMask
11
+ from cellprofiler_library.opts import threshold as Threshold
12
+ from cellprofiler_library.opts.crop import RemovalMethod
12
13
 
13
14
  def rgb_to_greyscale(image):
14
15
  if image.shape[-1] == 4:
@@ -616,4 +617,234 @@ def image_to_objects(
616
617
  if preserve_label and not cast_to_bool:
617
618
  return data
618
619
 
619
- return skimage.measure.label(data, background=background, connectivity=connectivity)
620
+ return skimage.measure.label(data, background=background, connectivity=connectivity)
621
+
622
+ ###########################################################################
623
+ # CorrectIlluminationApply
624
+ ###########################################################################
625
+
626
+ def apply_divide(image_pixels: Image2D, illum_function_pixel_data: Image2D) -> Image2D:
627
+ return image_pixels / illum_function_pixel_data
628
+
629
+ def apply_subtract(image_pixels: Image2D, illum_function_pixel_data: Image2D) -> Image2D:
630
+ output_image = image_pixels - illum_function_pixel_data
631
+ output_image[output_image < 0] = 0
632
+ return output_image
633
+
634
+ def clip_low(output_pixels: Image2D) -> Image2D:
635
+ return numpy.where(output_pixels < 0, 0, output_pixels)
636
+
637
+ def clip_high(output_pixels: Image2D) -> Image2D:
638
+ return numpy.where(output_pixels > 1, 1, output_pixels)
639
+
640
+ ################################################################################
641
+ # Crop
642
+ ################################################################################
643
+
644
+ def get_ellipse_cropping(
645
+ orig_image_pixels: Image2D,
646
+ ellipse_center: Tuple[float, float],
647
+ ellipse_radius: Tuple[float, float]
648
+ ) -> Image2DMask:
649
+ x_center, y_center = ellipse_center
650
+ x_radius, y_radius = ellipse_radius
651
+ x_max = orig_image_pixels.shape[1]
652
+ y_max = orig_image_pixels.shape[0]
653
+ if x_radius > y_radius:
654
+ dist_x = math.sqrt(x_radius ** 2 - y_radius ** 2)
655
+ dist_y = 0
656
+ major_radius = x_radius
657
+ else:
658
+ dist_x = 0
659
+ dist_y = math.sqrt(y_radius ** 2 - x_radius ** 2)
660
+ major_radius = y_radius
661
+
662
+ focus_1_x, focus_1_y = (x_center - dist_x, y_center - dist_y)
663
+ focus_2_x, focus_2_y = (x_center + dist_x, y_center + dist_y)
664
+ y, x = numpy.mgrid[0:y_max, 0:x_max]
665
+ d1 = numpy.sqrt((x - focus_1_x) ** 2 + (y - focus_1_y) ** 2)
666
+ d2 = numpy.sqrt((x - focus_2_x) ** 2 + (y - focus_2_y) ** 2)
667
+ cropping = d1 + d2 <= major_radius * 2
668
+ return cropping
669
+
670
+
671
+ def get_rectangle_cropping(
672
+ orig_image_pixels: Image2D,
673
+ bounding_box: Tuple[Optional[int], Optional[int], Optional[int], Optional[int]],
674
+ validate_boundaries: bool = True
675
+ ) -> Image2DMask:
676
+ cropping = numpy.ones(orig_image_pixels.shape[:2], bool)
677
+ left, right, top, bottom = bounding_box
678
+ if validate_boundaries:
679
+ if left and left > 0:
680
+ cropping[:, :left] = False
681
+ if right and right < cropping.shape[1]:
682
+ cropping[:, right:] = False
683
+ if top and top > 0:
684
+ cropping[:top, :] = False
685
+ if bottom and bottom < cropping.shape[0]:
686
+ cropping[bottom:, :] = False
687
+ else:
688
+ cropping[:, :left] = False
689
+ cropping[:, right:] = False
690
+ cropping[:top, :] = False
691
+ cropping[bottom:, :] = False
692
+ return cropping
693
+
694
+
695
+ def crop_image(
696
+ image: Union[Image2D, Image2DMask],
697
+ crop_mask: Image2DMask,
698
+ crop_internal: Optional[bool]=False
699
+ ) -> Union[Image2D, Image2DMask]:
700
+ """Crop an image to the size of the nonzero portion of a crop mask"""
701
+ i_histogram = crop_mask.sum(axis=1)
702
+ i_cumsum = numpy.cumsum(i_histogram != 0)
703
+ j_histogram = crop_mask.sum(axis=0)
704
+ j_cumsum = numpy.cumsum(j_histogram != 0)
705
+ if i_cumsum[-1] == 0:
706
+ # The whole image is cropped away
707
+ return numpy.zeros((0, 0), dtype=image.dtype)
708
+ if crop_internal:
709
+ #
710
+ # Make up sequences of rows and columns to keep
711
+ #
712
+ i_keep = numpy.argwhere(i_histogram > 0)
713
+ j_keep = numpy.argwhere(j_histogram > 0)
714
+ #
715
+ # Then slice the array by I, then by J to get what's not blank
716
+ #
717
+ return image[i_keep.flatten(), :][:, j_keep.flatten()].copy()
718
+ else:
719
+ #
720
+ # The first non-blank row and column are where the cumsum is 1
721
+ # The last are at the first where the cumsum is it's max (meaning
722
+ # what came after was all zeros and added nothing)
723
+ #
724
+ i_first = numpy.argwhere(i_cumsum == 1)[0]
725
+ i_last = numpy.argwhere(i_cumsum == i_cumsum.max())[0]
726
+ i_end = i_last + 1
727
+ j_first = numpy.argwhere(j_cumsum == 1)[0]
728
+ j_last = numpy.argwhere(j_cumsum == j_cumsum.max())[0]
729
+ j_end = j_last + 1
730
+
731
+ if image.ndim == 3:
732
+ return image[i_first[0] : i_end[0], j_first[0] : j_end[0], :].copy()
733
+
734
+ return image[i_first[0] : i_end[0], j_first[0] : j_end[0]].copy()
735
+
736
+
737
+ def get_cropped_mask(
738
+ cropping: Image2DMask,
739
+ mask: Optional[Image2DMask],
740
+ removal_method: RemovalMethod = RemovalMethod.NO,
741
+ ) -> Image2DMask:
742
+ if removal_method == RemovalMethod.NO:
743
+ #
744
+ # Check for previous cropping's mask. If it doesn't exist, set it to the current cropping
745
+ #
746
+ if mask is None:
747
+ mask = cropping
748
+ elif removal_method in (RemovalMethod.EDGES, RemovalMethod.ALL):
749
+ crop_internal = removal_method == RemovalMethod.ALL
750
+ #
751
+ # Check for previous cropping's mask. If it doesn't exist, set it to the region of interest specified
752
+ # by the cropping. The final mask output size could be smaller as the crop_image function removes
753
+ # edges by default.
754
+ #
755
+ if mask is None:
756
+ mask = crop_image(cropping, cropping, crop_internal)
757
+ else:
758
+ raise NotImplementedError(f"Unimplemented removal method: {removal_method}")
759
+ assert mask is not None
760
+ return mask
761
+
762
+
763
+ def get_cropped_image_mask(
764
+ cropping: Image2DMask,
765
+ mask: Optional[Image2DMask],
766
+ orig_image_mask: Optional[Image2DMask] = None,
767
+ removal_method: RemovalMethod = RemovalMethod.NO,
768
+ ) -> Image2DMask:
769
+ if mask is None:
770
+ mask = get_cropped_mask(cropping, mask, removal_method)
771
+ if removal_method == RemovalMethod.NO:
772
+ #
773
+ # Check if a mask has been set on the original image. If not, set it to the current mask
774
+ # This is a mask that could have been set by another module and this module "respects masks".
775
+ #
776
+ if orig_image_mask is not None:
777
+ # Image mask is the region of interest indicator for the final image object.
778
+ image_mask = orig_image_mask & mask
779
+ else:
780
+ image_mask = mask
781
+
782
+ return image_mask
783
+ elif removal_method in (RemovalMethod.EDGES, RemovalMethod.ALL):
784
+ crop_internal = removal_method == RemovalMethod.ALL
785
+ #
786
+ # Check if a mask has been set on the original image. If not, set it to the current mask
787
+ # This is a mask that could have been set by another module and this module "respects masks".
788
+ # The final mask output size could be smaller as the crop_image function removes edges by default.
789
+ #
790
+ if orig_image_mask is not None:
791
+ # Image mask is the region of interest indicator for the final image object.
792
+ image_mask = crop_image(orig_image_mask, cropping, crop_internal) & mask
793
+ else:
794
+ image_mask = mask
795
+ else:
796
+ raise NotImplementedError(f"Unimplemented removal method: {removal_method}")
797
+
798
+ return image_mask
799
+
800
+
801
+ def get_cropped_image_pixels(
802
+ orig_image_pixels: Image2D,
803
+ cropping: Image2DMask,
804
+ mask: Optional[Image2DMask],
805
+ removal_method: RemovalMethod = RemovalMethod.NO,
806
+ ) -> Image2D:
807
+ if removal_method == RemovalMethod.NO:
808
+ cropped_pixel_data = apply_crop_keep_rows_and_columns(orig_image_pixels, cropping)
809
+ elif removal_method in (RemovalMethod.EDGES, RemovalMethod.ALL):
810
+ cropped_pixel_data = apply_crop_remove_rows_and_columns(orig_image_pixels, cropping, mask, removal_method)
811
+ else:
812
+ raise NotImplementedError(f"Unimplemented removal method: {removal_method}")
813
+ return cropped_pixel_data
814
+
815
+
816
+ def apply_crop_keep_rows_and_columns(
817
+ orig_image_pixels: Image2D,
818
+ final_cropping: Image2DMask,
819
+ ) -> Image2D:
820
+ cropped_pixel_data = orig_image_pixels.copy()
821
+ cropped_pixel_data = erase_pixels(cropped_pixel_data, final_cropping)
822
+ return cropped_pixel_data
823
+
824
+
825
+ def apply_crop_remove_rows_and_columns(
826
+ orig_image_pixels: Image2D,
827
+ final_cropping: Image2DMask,
828
+ mask: Optional[Image2DMask],
829
+ removal_method: RemovalMethod = RemovalMethod.EDGES,
830
+ ) -> Image2D:
831
+ if mask is None:
832
+ mask = get_cropped_mask(final_cropping, mask, removal_method)
833
+ # Apply first level of cropping to get the region of interest that matches the original image
834
+ cropped_pixel_data = crop_image(orig_image_pixels, final_cropping, removal_method==RemovalMethod.ALL)
835
+ cropped_pixel_data = erase_pixels(cropped_pixel_data, mask)
836
+ return cropped_pixel_data
837
+
838
+
839
+ def erase_pixels(
840
+ cropped_pixel_data: Image2D,
841
+ crop: Image2DMask
842
+ ) -> Image2D:
843
+ #
844
+ # Apply crop to all channels automatically for color images
845
+ #
846
+ if cropped_pixel_data.ndim == 3:
847
+ cropped_pixel_data[~crop, :] = 0
848
+ else:
849
+ cropped_pixel_data[~crop] = 0
850
+ return cropped_pixel_data
@@ -0,0 +1,40 @@
1
+ from typing import Annotated, Optional
2
+ from pydantic import Field, validate_call, ConfigDict
3
+ from cellprofiler_library.opts.correctilluminationapply import Method
4
+ from ..types import Image2D
5
+ from ..functions.image_processing import apply_divide, apply_subtract, clip_low, clip_high
6
+
7
+
8
+ @validate_call(config=ConfigDict(arbitrary_types_allowed=True))
9
+ def correct_illumination_apply(
10
+ image_pixels: Annotated[Image2D, Field(description="Pixel data of image to apply the illumination function to")],
11
+ illum_function_pixel_data: Annotated[Image2D, Field(description="Pixel data of illumination function")],
12
+ method_divide_or_subtract: Annotated[Method, Field(description="Method to apply the illumination function")],
13
+ truncate_low: Annotated[Optional[bool], Field(description="Set output image values less than 0 equal to 0?")],
14
+ truncate_high: Annotated[Optional[bool], Field(description="Set output image values greater than 1 equal to 1?")],
15
+ ) -> Annotated[Image2D, Field(description="Pixel data of image with illumination function applied")]:
16
+ """
17
+ Perform illumination according to the parameters of one image setting group
18
+ """
19
+ assert image_pixels.shape[:2] == illum_function_pixel_data.shape[:2], "Input image shape and illumination function shape must be equal"
20
+ #
21
+ # Either divide or subtract the illumination image from the original
22
+ #
23
+ if method_divide_or_subtract == Method.DIVIDE:
24
+ output_pixels = apply_divide(image_pixels, illum_function_pixel_data)
25
+ elif method_divide_or_subtract == Method.SUBTRACT:
26
+ output_pixels = apply_subtract(image_pixels, illum_function_pixel_data)
27
+ else:
28
+ raise ValueError(
29
+ "Unhandled option for divide or subtract: %s"
30
+ % method_divide_or_subtract.value
31
+ )
32
+ #
33
+ # Optionally, clip high and low values
34
+ #
35
+ if truncate_low:
36
+ output_pixels = clip_low(output_pixels)
37
+ if truncate_high:
38
+ output_pixels = clip_high(output_pixels)
39
+
40
+ return output_pixels
@@ -0,0 +1,45 @@
1
+ from typing import Annotated, Optional, Tuple, List
2
+ from pydantic import Field, validate_call, ConfigDict
3
+ import numpy
4
+ from cellprofiler_library.types import Image2D, Image2DMask
5
+ from cellprofiler_library.functions.image_processing import get_cropped_mask, get_cropped_image_mask, get_cropped_image_pixels
6
+ from cellprofiler_library.opts.crop import RemovalMethod, Measurement
7
+
8
+ @validate_call(config=ConfigDict(arbitrary_types_allowed=True))
9
+ def crop(
10
+ orig_image_pixels: Annotated[Image2D, Field(description="Pixel values of the original image")],
11
+ cropping: Annotated[Image2DMask, Field(description="The region of interest to be kept. 1 for pixels to keep, 0 for pixels to remove")],
12
+ mask: Annotated[Optional[Image2DMask], Field(description="Previous cropping's mask")],
13
+ orig_image_mask: Annotated[Optional[Image2DMask], Field(description="Mask that may have been set on the original image")],
14
+ removal_method: Annotated[RemovalMethod, Field(description="Removal method")],
15
+ ) -> Tuple[Image2D, Image2DMask, Image2DMask]:
16
+ #
17
+ # Crop the mask
18
+ #
19
+ mask = get_cropped_mask(cropping, mask, removal_method)
20
+
21
+ #
22
+ # Crop the image_mask
23
+ image_mask = get_cropped_image_mask(cropping, mask, orig_image_mask, removal_method)
24
+
25
+ #
26
+ # Crop the image
27
+ #
28
+ cropped_pixel_data = get_cropped_image_pixels(orig_image_pixels, cropping, mask, removal_method)
29
+
30
+ return cropped_pixel_data, mask, image_mask
31
+
32
+ @validate_call(config=ConfigDict(arbitrary_types_allowed=True))
33
+ def measure_area_retained_after_cropping(cropping: Image2DMask) -> int:
34
+ return numpy.sum(cropping.astype(float))
35
+
36
+ @validate_call(config=ConfigDict(arbitrary_types_allowed=True))
37
+ def measure_original_image_area(orig_image_pixels: Image2D) -> int:
38
+ return numpy.product(orig_image_pixels.shape)
39
+
40
+ @validate_call(config=ConfigDict(arbitrary_types_allowed=True))
41
+ def get_measurements(cropping: Image2DMask, orig_image_pixels:Image2D, cropped_image_name: str = "CroppedImage") -> List[Tuple[str, str, int]]:
42
+ orig_image_area = measure_original_image_area(orig_image_pixels)
43
+ area_retained_after_cropping = measure_area_retained_after_cropping(cropping)
44
+ return [("Image", str(Measurement.ORIGINAL_AREA % cropped_image_name), orig_image_area),
45
+ ("Image", str(Measurement.AREA_RETAINED % cropped_image_name), area_retained_after_cropping)]
@@ -0,0 +1,5 @@
1
+ from enum import Enum
2
+
3
+ class Method(str, Enum):
4
+ DIVIDE = "Divide"
5
+ SUBTRACT = "Subtract"
@@ -0,0 +1,41 @@
1
+ from enum import Enum
2
+
3
+ class Shape(str, Enum):
4
+ RECTANGLE = "Rectangle"
5
+ ELLIPSE = "Ellipse"
6
+ IMAGE = "Image"
7
+ OBJECTS = "Objects"
8
+ CROPPING = "Previous cropping"
9
+
10
+ class RemovalMethod(str, Enum):
11
+ NO = "No"
12
+ EDGES = "Edges"
13
+ ALL = "All"
14
+
15
+ class Measurement(str, Enum):
16
+ AREA_RETAINED = "Crop_AreaRetainedAfterCropping_%s"
17
+ ORIGINAL_AREA = "Crop_OriginalImageArea_%s"
18
+
19
+ class CroppingMethod(str, Enum):
20
+ COORDINATES = "Coordinates"
21
+ MOUSE = "Mouse"
22
+
23
+ class CroppingPattern(str, Enum):
24
+ FIRST = "First"
25
+ INDIVIDUALLY = "Individually"
26
+
27
+ class Limits(str, Enum):
28
+ ABSOLUTE = "Absolute"
29
+ FROM_EDGE = "From edge"
30
+
31
+ class Ellipse(str, Enum):
32
+ XCENTER = "xcenter"
33
+ YCENTER = "ycenter"
34
+ XRADIUS = "xradius"
35
+ YRADIUS = "yradius"
36
+
37
+ class Rectangle(str, Enum):
38
+ LEFT = "left"
39
+ TOP = "top"
40
+ RIGHT = "right"
41
+ BOTTOM = "bottom"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cellprofiler-library-nightly
3
- Version: 5.0.0.dev313
3
+ Version: 5.0.0.dev321
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>
@@ -1,10 +1,10 @@
1
1
  cellprofiler_library/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
- cellprofiler_library/_version.py,sha256=X4VkWpCY3W1OoL-UO0Ujz6sOnuBoWBDUvHRgT9ivJRQ,721
2
+ cellprofiler_library/_version.py,sha256=mYUqqa6M-iE4MBhf8kLEwQQ_kh9UFT5QdUWnnrI5Hl0,721
3
3
  cellprofiler_library/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
4
  cellprofiler_library/types.py,sha256=5cCxXOO_TE-uSF4ZB6sDG3eTZ1VWDSXUFifg0N4JYs8,8516
5
5
  cellprofiler_library/functions/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
6
6
  cellprofiler_library/functions/file_processing.py,sha256=jumpdgxReyV5xzF4YXZWhkei9CQ9GtWD-VUCuFh-FZM,5168
7
- cellprofiler_library/functions/image_processing.py,sha256=qZLEVpG3IOfgPUH_cJ0k6HVWklHU08JJvxWPnO48qIo,24015
7
+ cellprofiler_library/functions/image_processing.py,sha256=s13691o7-peaL-mVOA4J50ZynqXioSjfJ7vfTjfdm5M,33152
8
8
  cellprofiler_library/functions/measurement.py,sha256=8pXcEb1fLgwOEDiTJho1_O-fFGTtIp-Qn1lStjQBjbo,29221
9
9
  cellprofiler_library/functions/object_processing.py,sha256=3cKNq5ewBf_HWz6rdX3XR4WUbd6SklbHZ_H40xt9ODM,19443
10
10
  cellprofiler_library/functions/segmentation.py,sha256=LNE22ByY0X7GepQaHqLdxkzlmIXjD3EglAYJjtT2dGo,25257
@@ -14,6 +14,8 @@ cellprofiler_library/modules/_colortogray.py,sha256=UtiBgh7AXduRBMkHsv2L0u7FayOC
14
14
  cellprofiler_library/modules/_combineobjects.py,sha256=dZz0RXjvVukem3e46wPfQWOQCOfMLHaq0KoFzjKVQqs,830
15
15
  cellprofiler_library/modules/_convertimagetoobjects.py,sha256=_X2YWEHK4hFaP13LEBD-vIwwUUhgJEJLcTkhyMe4JBA,1075
16
16
  cellprofiler_library/modules/_convertobjectstoimage.py,sha256=PMYjH_prBKma4LNgUxmA5GzF7fQ6ko09XszKatTulB4,2274
17
+ cellprofiler_library/modules/_correctilluminationapply.py,sha256=8bZC3AnQv3vpUrNSnLvcc_s0E-P63XbrfwMv7OZNjt4,2084
18
+ cellprofiler_library/modules/_crop.py,sha256=0T0sQsK7o5dHVXMZ4OqvAJkskkyez1MXcnPlU5yqsV4,2422
17
19
  cellprofiler_library/modules/_enhanceedges.py,sha256=PaXZck8fPcxRf-IXCstu-OWmsvM_rDDPMMQ3cZFfVZc,2951
18
20
  cellprofiler_library/modules/_expandorshrinkobjects.py,sha256=A1oeW_O8C5NLJr-xU1R9pSulDau8XUeWaKiilpr-85g,856
19
21
  cellprofiler_library/modules/_fillobjects.py,sha256=1zvlZNJhG8kEzAnVyiSLGPNE338EB5wopD2eK0BVWrc,469
@@ -33,11 +35,13 @@ cellprofiler_library/opts/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJW
33
35
  cellprofiler_library/opts/colortogray.py,sha256=ptAanLQW9iMgQHgC7xvYlbIbshBd5d7uE48t2F0Z5e8,344
34
36
  cellprofiler_library/opts/convertimagetoobjects.py,sha256=9e3VOdpjd4084ATZyFtSQg_VpxbyXrYVFmEFJkrHakg,67
35
37
  cellprofiler_library/opts/convertobjectstoimage.py,sha256=U3jeVtKYFgfxbO7NYndanAyZFoEvbyScOq4T8cpjfX8,188
38
+ cellprofiler_library/opts/correctilluminationapply.py,sha256=IkAqjMjaRdsoY2aXw5_dLI1iRYqCwvcNwCWEpWNZrN4,96
39
+ cellprofiler_library/opts/crop.py,sha256=GaArWq3WZd_Ykunj1SSbFOYkqDQ6TXy2MDKxG4fA6ZE,879
36
40
  cellprofiler_library/opts/measureimageoverlap.py,sha256=uopQCJTX1Uk-NNDAISsdYEOuOtiEBYOyCwu57ZT7X84,134
37
41
  cellprofiler_library/opts/objectsizeshapefeatures.py,sha256=3GIntOH3qXs7F16Tpjmtg7opHYAmmOjEdEwW6q3ht_Y,6306
38
42
  cellprofiler_library/opts/threshold.py,sha256=yg_i5to22Nd9hTakaRxo9UIQZRYWFpavJimjl5JONx4,938
39
- cellprofiler_library_nightly-5.0.0.dev313.dist-info/licenses/LICENSE,sha256=QLWaBS7kAioYx7PmJNXAMJaY8NODcFAag60YlUWuyz0,2276
40
- cellprofiler_library_nightly-5.0.0.dev313.dist-info/METADATA,sha256=--nBROD-RBpNvkLYSVE2ZBgR00courMI1CoD_ShpwhI,5534
41
- cellprofiler_library_nightly-5.0.0.dev313.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
42
- cellprofiler_library_nightly-5.0.0.dev313.dist-info/top_level.txt,sha256=LXq0ApDeDD4gotb6YFTySzdyScvHfS_pqoTg1QsNLBs,21
43
- cellprofiler_library_nightly-5.0.0.dev313.dist-info/RECORD,,
43
+ cellprofiler_library_nightly-5.0.0.dev321.dist-info/licenses/LICENSE,sha256=QLWaBS7kAioYx7PmJNXAMJaY8NODcFAag60YlUWuyz0,2276
44
+ cellprofiler_library_nightly-5.0.0.dev321.dist-info/METADATA,sha256=Ib4P-ixq4tVByZcQfLqOeJ6ZbhOfoYEsXV4C0Z2qAa8,5534
45
+ cellprofiler_library_nightly-5.0.0.dev321.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
46
+ cellprofiler_library_nightly-5.0.0.dev321.dist-info/top_level.txt,sha256=LXq0ApDeDD4gotb6YFTySzdyScvHfS_pqoTg1QsNLBs,21
47
+ cellprofiler_library_nightly-5.0.0.dev321.dist-info/RECORD,,