def test_decimate_k_means(): r = numpy.random.RandomState() r.seed(64) img = r.uniform(size=(10, 10)) > 0.5 workspace, module = make_workspace(dict(image=img), dict(image=img.transpose())) # # Pick a single point for decimation - the emd should be zero # module.max_points._Number__minval = 1 module.max_points.value = 1 module.run(workspace) assert ( workspace.measurements[ cellprofiler_core.measurement.IMAGE, module.measurement_name( cellprofiler.modules.measureimageoverlap.FTR_EARTH_MOVERS_DISTANCE ), ] == 0 ) # # Pick a large number of points to get the real EMD # workspace, module = make_workspace(dict(image=img), dict(image=img.transpose())) module.max_points._Number__minval = 1 module.max_points.value = 100 module.run(workspace) emd = workspace.measurements[ cellprofiler_core.measurement.IMAGE, module.measurement_name( cellprofiler.modules.measureimageoverlap.FTR_EARTH_MOVERS_DISTANCE ), ] # # The EMD after decimation is going to be randomly different, # but not by much. # workspace, module = make_workspace(dict(image=img), dict(image=img.transpose())) module.max_points._Number__minval = 1 module.max_points.value = numpy.sum(img | img.transpose()) / 2 module.run(workspace) decimated_emd = workspace.measurements[ cellprofiler_core.measurement.IMAGE, module.measurement_name( cellprofiler.modules.measureimageoverlap.FTR_EARTH_MOVERS_DISTANCE ), ] assert decimated_emd < emd * 2 assert decimated_emd > emd / 2
def test_zeros(): """Test ground-truth of zeros and image of zeros""" workspace, module = make_workspace(dict(image=numpy.ones((20, 10), bool)), dict(image=numpy.ones((20, 10), bool))) assert isinstance( module, cellprofiler.modules.measureimageoverlap.MeasureImageOverlap) module.run(workspace) measurements = workspace.measurements assert isinstance(measurements, cellprofiler_core.measurement.Measurements) assert measurements.get_current_image_measurement( "Overlap_FalseNegRate_test") == 0 features = measurements.get_feature_names("Image") for feature in cellprofiler.modules.measureimageoverlap.FTR_ALL + [ cellprofiler.modules.measureimageoverlap.FTR_EARTH_MOVERS_DISTANCE ]: field = "_".join(( cellprofiler.modules.measureimageoverlap.C_IMAGE_OVERLAP, feature, TEST_IMAGE_NAME, )) assert field in features, "Missing feature: %s" % feature ftr_emd = module.measurement_name( cellprofiler.modules.measureimageoverlap.FTR_EARTH_MOVERS_DISTANCE) assert measurements["Image", ftr_emd] == 0
def test_no_emd(): workspace, module = make_workspace(dict(image=numpy.ones((20, 10), bool)), dict(image=numpy.ones((20, 10), bool))) module.wants_emd.value = False module.run(workspace) assert not workspace.measurements.has_feature( "Image", module.measurement_name(cellprofiler.modules.measureimageoverlap. FTR_EARTH_MOVERS_DISTANCE), )
def test_max_distance(): src = numpy.zeros((20, 10), bool) dest = numpy.zeros((20, 10), bool) src[5, 3] = True dest[8, 7] = True src[19, 9] = True dest[11, 9] = True workspace, module = make_workspace(dict(image=src), dict(image=dest)) module.max_distance.value = 6 module.run(workspace) assert (workspace.measurements[ "Image", module.measurement_name(cellprofiler.modules.measureimageoverlap. FTR_EARTH_MOVERS_DISTANCE), ] == 11)
def test_one_pixel(): # # The earth movers distance should be sqrt((8-5)**2 + (7 - 3) ** 2) = 5 # src = numpy.zeros((20, 10), bool) dest = numpy.zeros((20, 10), bool) src[5, 3] = True dest[8, 7] = True workspace, module = make_workspace(dict(image=src), dict(image=dest)) module.run(workspace) assert (workspace.measurements[ "Image", module.measurement_name(cellprofiler.modules.measureimageoverlap. FTR_EARTH_MOVERS_DISTANCE), ] == 5)
def test_decimate_skel(): # # Mostly, this is to check that the skeleton method doesn't crash # i, j = numpy.mgrid[0:10, 0:20] image1 = ((i - 4)**2) * 4 + (j - 8)**2 < 32 image2 = ((i - 6)**2) * 4 + (j - 12)**2 < 32 workspace, module = make_workspace(dict(image=image1), dict(image=image2)) module.max_points._Number__minval = 1 module.max_points.value = 5 module.decimation_method.value = cellprofiler.modules.measureimageoverlap.DM_SKEL module.run(workspace) emd = workspace.measurements[ "Image", module.measurement_name(cellprofiler.modules.measureimageoverlap. FTR_EARTH_MOVERS_DISTANCE), ] assert emd > numpy.sum(image1) * 3 assert emd < numpy.sum(image1) * 6
def test_missing_penalty(): # # Test that the missing penalty works # src = numpy.zeros((20, 10), bool) dest = numpy.zeros((20, 10), bool) src[2, 2] = True dest[2, 2] = True dest[8, 7] = True dest[2, 6] = True workspace, module = make_workspace(dict(image=src), dict(image=dest)) module.penalize_missing.value = True module.max_distance.value = 8 module.run(workspace) assert (workspace.measurements[ "Image", module.measurement_name(cellprofiler.modules.measureimageoverlap. FTR_EARTH_MOVERS_DISTANCE), ] == 16)
def test_test_measure_overlap_no_objects(): # Regression test of issue #934 - no objects workspace, module = make_obj_workspace( numpy.zeros((0, 3), int), numpy.zeros((0, 3), int), dict(image=numpy.zeros((20, 10), bool)), dict(image=numpy.zeros((20, 10), bool)), ) module.run(workspace) m = workspace.measurements for feature in cellprofiler.modules.measureobjectoverlap.FTR_ALL: mname = module.measurement_name(feature) value = m["Image", mname, 1] if feature == cellprofiler.modules.measureobjectoverlap.FTR_TRUE_NEG_RATE: assert value == 1 elif feature == cellprofiler.modules.measureobjectoverlap.FTR_FALSE_POS_RATE: assert value == 0 else: assert numpy.isnan(value), "%s was %f. not nan" % (mname, value) # # Make sure they don't crash # workspace, module = make_obj_workspace( numpy.zeros((0, 3), int), numpy.ones((1, 3), int), dict(image=numpy.zeros((20, 10), bool)), dict(image=numpy.zeros((20, 10), bool)), ) module.run(workspace) workspace, module = make_obj_workspace( numpy.ones((1, 3), int), numpy.zeros((0, 3), int), dict(image=numpy.zeros((20, 10), bool)), dict(image=numpy.zeros((20, 10), bool)), ) module.run(workspace)
def test_3D_no_overlap(): ground_truth_image_data = numpy.zeros((10, 100, 100), dtype=numpy.bool_) ground_truth_image_data[4:6, 30:40, 30:40] = True ground_truth_image_data[7:10, 50:60, 50:60] = True test_image_data = numpy.zeros((10, 100, 100), dtype=numpy.bool_) test_image_data[7:9, 30:40, 30:40] = True test_image_data[7:10, 70:80, 70:80] = True workspace, module = make_workspace( ground_truth={"image": ground_truth_image_data}, test={"image": test_image_data}, dimensions=3, ) module.run(workspace) measurements = workspace.measurements ftr_true_pos_rate = module.measurement_name( cellprofiler.modules.measureimageoverlap.FTR_TRUE_POS_RATE) ftr_true_pos_rate_measurement = measurements.get_current_image_measurement( ftr_true_pos_rate) assert round(abs(ftr_true_pos_rate_measurement - 0), 7) == 0 ftr_false_pos_rate = module.measurement_name( cellprofiler.modules.measureimageoverlap.FTR_FALSE_POS_RATE) ftr_false_pos_rate_measurement = measurements.get_current_image_measurement( ftr_false_pos_rate) assert round(abs(ftr_false_pos_rate_measurement - 0.005025125628141), 7) == 0 ftr_true_neg_rate = module.measurement_name( cellprofiler.modules.measureimageoverlap.FTR_TRUE_NEG_RATE) ftr_true_neg_rate_measurement = measurements.get_current_image_measurement( ftr_true_neg_rate) assert round(abs(ftr_true_neg_rate_measurement - 0.994974874371859), 7) == 0 ftr_false_neg_rate = module.measurement_name( cellprofiler.modules.measureimageoverlap.FTR_FALSE_NEG_RATE) ftr_false_neg_rate_measurement = measurements.get_current_image_measurement( ftr_false_neg_rate) assert round(abs(ftr_false_neg_rate_measurement - 1), 7) == 0 ftr_precision = module.measurement_name( cellprofiler.modules.measureimageoverlap.FTR_PRECISION) ftr_precision_measurement = measurements.get_current_image_measurement( ftr_precision) assert round(abs(ftr_precision_measurement - 0), 7) == 0 ftr_recall = module.measurement_name( cellprofiler.modules.measureimageoverlap.FTR_RECALL) ftr_recall_measurement = measurements.get_current_image_measurement( ftr_recall) assert round(abs(ftr_recall_measurement - 0), 7) == 0 ftr_F_factor = module.measurement_name( cellprofiler.modules.measureimageoverlap.FTR_F_FACTOR) ftr_F_factor_measurement = measurements.get_current_image_measurement( ftr_F_factor) assert round(abs(ftr_F_factor_measurement - 0), 7) == 0 ftr_Earth_Movers_Distance = module.measurement_name( cellprofiler.modules.measureimageoverlap.FTR_EARTH_MOVERS_DISTANCE) ftr_Earth_Movers_Distance_measurement = measurements.get_current_image_measurement( ftr_Earth_Movers_Distance) assert round(abs(ftr_Earth_Movers_Distance_measurement - 52785), 7) == 0 ftr_rand_index = module.measurement_name( cellprofiler.modules.measureimageoverlap.FTR_RAND_INDEX) ftr_rand_index_measurement = measurements.get_current_image_measurement( ftr_rand_index) assert round(abs(ftr_rand_index_measurement - 0.980199801998020), 2) == 0 ftr_adj_rand_index = module.measurement_name( cellprofiler.modules.measureimageoverlap.FTR_ADJUSTED_RAND_INDEX) ftr_adj_rand_index_measurement = measurements.get_current_image_measurement( ftr_adj_rand_index) numpy.testing.assert_almost_equal(ftr_adj_rand_index_measurement, 0, 2)
def test_3D_perfect_overlap(): image_data = numpy.random.rand(10, 100, 100) >= 0.5 workspace, module = make_workspace(ground_truth={"image": image_data}, test={"image": image_data}, dimensions=3) module.run(workspace) measurements = workspace.measurements ftr_precision = module.measurement_name( cellprofiler.modules.measureimageoverlap.FTR_PRECISION) ftr_precision_measurement = measurements.get_current_image_measurement( ftr_precision) assert ftr_precision_measurement == 1.0 ftr_true_pos_rate = module.measurement_name( cellprofiler.modules.measureimageoverlap.FTR_TRUE_POS_RATE) ftr_true_pos_rate_measurement = measurements.get_current_image_measurement( ftr_true_pos_rate) assert ftr_true_pos_rate_measurement == 1.0 ftr_false_pos_rate = module.measurement_name( cellprofiler.modules.measureimageoverlap.FTR_FALSE_POS_RATE) ftr_false_pos_rate_measurement = measurements.get_current_image_measurement( ftr_false_pos_rate) assert ftr_false_pos_rate_measurement == 0 ftr_true_neg_rate = module.measurement_name( cellprofiler.modules.measureimageoverlap.FTR_TRUE_NEG_RATE) ftr_true_neg_rate_measurement = measurements.get_current_image_measurement( ftr_true_neg_rate) assert ftr_true_neg_rate_measurement == 1.0 ftr_false_neg_rate = module.measurement_name( cellprofiler.modules.measureimageoverlap.FTR_FALSE_NEG_RATE) ftr_false_neg_rate_measurement = measurements.get_current_image_measurement( ftr_false_neg_rate) assert ftr_false_neg_rate_measurement == 0 ftr_precision = module.measurement_name( cellprofiler.modules.measureimageoverlap.FTR_PRECISION) ftr_precision_measurement = measurements.get_current_image_measurement( ftr_precision) assert round(abs(ftr_precision_measurement - 1), 7) == 0 ftr_F_factor = module.measurement_name( cellprofiler.modules.measureimageoverlap.FTR_F_FACTOR) ftr_F_factor_measurement = measurements.get_current_image_measurement( ftr_F_factor) assert round(abs(ftr_F_factor_measurement - 1), 7) == 0 ftr_Earth_Movers_Distance = module.measurement_name( cellprofiler.modules.measureimageoverlap.FTR_EARTH_MOVERS_DISTANCE) ftr_Earth_Movers_Distance_measurement = measurements.get_current_image_measurement( ftr_Earth_Movers_Distance) assert round(abs(ftr_Earth_Movers_Distance_measurement - 0), 7) == 0 ftr_rand_index = module.measurement_name( cellprofiler.modules.measureimageoverlap.FTR_RAND_INDEX) ftr_rand_index_measurement = measurements.get_current_image_measurement( ftr_rand_index) assert round(abs(ftr_rand_index_measurement - 1), 7) == 0 ftr_adj_rand_index = module.measurement_name( cellprofiler.modules.measureimageoverlap.FTR_ADJUSTED_RAND_INDEX) ftr_adj_rand_index_measurement = measurements.get_current_image_measurement( ftr_adj_rand_index) assert round(abs(ftr_adj_rand_index_measurement - 1), 7) == 0