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.
- cellprofiler_library/_version.py +2 -2
- cellprofiler_library/functions/image_processing.py +235 -4
- cellprofiler_library/modules/_correctilluminationapply.py +40 -0
- cellprofiler_library/modules/_crop.py +45 -0
- cellprofiler_library/opts/correctilluminationapply.py +5 -0
- cellprofiler_library/opts/crop.py +41 -0
- {cellprofiler_library_nightly-5.0.0.dev313.dist-info → cellprofiler_library_nightly-5.0.0.dev321.dist-info}/METADATA +1 -1
- {cellprofiler_library_nightly-5.0.0.dev313.dist-info → cellprofiler_library_nightly-5.0.0.dev321.dist-info}/RECORD +11 -7
- {cellprofiler_library_nightly-5.0.0.dev313.dist-info → cellprofiler_library_nightly-5.0.0.dev321.dist-info}/WHEEL +0 -0
- {cellprofiler_library_nightly-5.0.0.dev313.dist-info → cellprofiler_library_nightly-5.0.0.dev321.dist-info}/licenses/LICENSE +0 -0
- {cellprofiler_library_nightly-5.0.0.dev313.dist-info → cellprofiler_library_nightly-5.0.0.dev321.dist-info}/top_level.txt +0 -0
cellprofiler_library/_version.py
CHANGED
|
@@ -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.
|
|
32
|
-
__version_tuple__ = version_tuple = (5, 0, 0, '
|
|
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
|
|
10
|
-
from
|
|
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,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.
|
|
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=
|
|
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=
|
|
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.
|
|
40
|
-
cellprofiler_library_nightly-5.0.0.
|
|
41
|
-
cellprofiler_library_nightly-5.0.0.
|
|
42
|
-
cellprofiler_library_nightly-5.0.0.
|
|
43
|
-
cellprofiler_library_nightly-5.0.0.
|
|
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,,
|
|
File without changes
|
|
File without changes
|