Esempio n. 1
0
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
Esempio n. 2
0
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
Esempio n. 3
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),
    )
Esempio n. 4
0
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)
Esempio n. 5
0
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)
Esempio n. 6
0
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
Esempio n. 7
0
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)
Esempio n. 8
0
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)
Esempio n. 9
0
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)
Esempio n. 10
0
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