def test_ndim(): regionprops(np.zeros((10, 10), dtype=np.int)) regionprops(np.zeros((10, 10, 1), dtype=np.int)) regionprops(np.zeros((10, 10, 1, 1), dtype=np.int)) regionprops(np.zeros((10, 10, 10), dtype=np.int)) with pytest.raises(TypeError): regionprops(np.zeros((10, 10, 10, 2), dtype=np.int))
def test_dtype(): regionprops(np.zeros((10, 10), dtype=np.int)) regionprops(np.zeros((10, 10), dtype=np.uint)) assert_raises((TypeError), regionprops, np.zeros((10, 10), dtype=np.float)) assert_raises((TypeError), regionprops, np.zeros((10, 10), dtype=np.double))
def test_euler_number(): en = regionprops(SAMPLE)[0].euler_number assert en == 0 SAMPLE_mod = SAMPLE.copy() SAMPLE_mod[7, -3] = 0 en = regionprops(SAMPLE_mod)[0].euler_number assert en == -1
def test_eccentricity(): eps = regionprops(SAMPLE)[0].eccentricity assert_almost_equal(eps, 0.814629313427) img = np.zeros((5, 5), dtype=np.int) img[2, 2] = 1 eps = regionprops(img)[0].eccentricity assert_almost_equal(eps, 0)
def test_bbox(): bbox = regionprops(SAMPLE)[0].bbox assert_array_almost_equal(bbox, (0, 0, SAMPLE.shape[0], SAMPLE.shape[1])) SAMPLE_mod = SAMPLE.copy() SAMPLE_mod[:, -1] = 0 bbox = regionprops(SAMPLE_mod)[0].bbox assert_array_almost_equal(bbox, (0, 0, SAMPLE.shape[0], SAMPLE.shape[1]-1))
def test_bbox(): bbox = regionprops(SAMPLE, ['BoundingBox'])[0]['BoundingBox'] assert_array_almost_equal(bbox, (0, 0, SAMPLE.shape[0], SAMPLE.shape[1])) SAMPLE_mod = SAMPLE.copy() SAMPLE_mod[:, -1] = 0 bbox = regionprops(SAMPLE_mod, ['BoundingBox'])[0]['BoundingBox'] assert_array_almost_equal(bbox, (0, 0, SAMPLE.shape[0], SAMPLE.shape[1]-1))
def test_filled_area(): area = regionprops(SAMPLE, ['FilledArea'])[0]['FilledArea'] assert area == np.sum(SAMPLE) SAMPLE_mod = SAMPLE.copy() SAMPLE_mod[7, -3] = 0 area = regionprops(SAMPLE_mod, ['FilledArea'])[0]['FilledArea'] assert area == np.sum(SAMPLE)
def test_euler_number(): en = regionprops(SAMPLE, ['EulerNumber'])[0]['EulerNumber'] assert en == 0 SAMPLE_mod = SAMPLE.copy() SAMPLE_mod[7, -3] = 0 en = regionprops(SAMPLE_mod, ['EulerNumber'])[0]['EulerNumber'] assert en == -1
def test_iterate_all_props(): region = regionprops(SAMPLE)[0] p0 = dict((p, region[p]) for p in region) region = regionprops(SAMPLE, intensity_image=INTENSITY_SAMPLE)[0] p1 = dict((p, region[p]) for p in region) assert len(p0) < len(p1)
def test_filled_area(): area = regionprops(SAMPLE)[0].filled_area assert area == np.sum(SAMPLE) SAMPLE_mod = SAMPLE.copy() SAMPLE_mod[7, -3] = 0 area = regionprops(SAMPLE_mod)[0].filled_area assert area == np.sum(SAMPLE)
def test_euler_number(): with expected_warnings(['`background`|CObject type']): en = regionprops(SAMPLE)[0].euler_number assert en == 0 SAMPLE_mod = SAMPLE.copy() SAMPLE_mod[7, -3] = 0 with expected_warnings(['`background`|CObject type']): en = regionprops(SAMPLE_mod)[0].euler_number assert en == -1
def test_coordinates(): sample = np.zeros((10, 10), dtype=np.int8) coords = np.array([[3, 2], [3, 3], [3, 4]]) sample[coords[:, 0], coords[:, 1]] = 1 prop_coords = regionprops(sample)[0].coords assert_array_equal(prop_coords, coords) sample = np.zeros((6, 6, 6), dtype=np.int8) coords = np.array([[1, 1, 1], [1, 2, 1], [1, 3, 1]]) sample[coords[:, 0], coords[:, 1], coords[:, 2]] = 1 prop_coords = regionprops(sample)[0].coords assert_array_equal(prop_coords, coords)
def test_dtype(): regionprops(np.zeros((10, 10), dtype=np.int)) regionprops(np.zeros((10, 10), dtype=np.uint)) with pytest.raises(TypeError): regionprops(np.zeros((10, 10), dtype=np.float)) with pytest.raises(TypeError): regionprops(np.zeros((10, 10), dtype=np.double))
def test_equals(): arr = np.zeros((100, 100), dtype=np.int) arr[0:25, 0:25] = 1 arr[50:99, 50:99] = 2 regions = regionprops(arr) r1 = regions[0] regions = regionprops(arr) r2 = regions[0] r3 = regions[1] assert_equal(r1 == r2, True, "Same regionprops are not equal") assert_equal(r1 != r3, True, "Different regionprops are equal")
def test_equals(): arr = np.zeros((100, 100), dtype=np.int) arr[0:25, 0:25] = 1 arr[50:99, 50:99] = 2 regions = regionprops(arr) r1 = regions[0] regions = regionprops(arr) r2 = regions[0] r3 = regions[1] with expected_warnings(['`background`|CObject type']): assert_equal(r1 == r2, True, "Same regionprops are not equal") assert_equal(r1 != r3, True, "Different regionprops are equal")
def _measure_properties(self, z, metadata, p=25): from skimage.measure._regionprops import regionprops nim = z.copy() # nz = z[z > min(z) * 3] # for zi in z: # print zi mz = min(z) r = max(z) - mz t = p * 0.01 * r + mz # print 'aaaa', max(z), min(z) # print 'bbbb', t, p # t2 = percentile(nz, p) # t = percentile(z, p) # print 'nz ', t2, 'z ', t1 nim[z < t] = 0 props = None try: props = regionprops(nim.astype(int), ['EquivDiameter', 'Centroid', 'MajorAxisLength', 'MinorAxisLength', 'Orientation' ]) except TypeError as e: pass return props, nim
def test_all_props_3d(): region = regionprops(SAMPLE_3D, INTENSITY_SAMPLE_3D)[0] for prop in PROPS: try: assert_almost_equal(region[prop], getattr(region, PROPS[prop])) except NotImplementedError: pass
def test_invalid(): ps = regionprops(SAMPLE) def get_intensity_image(): ps[0].intensity_image assert_raises(AttributeError, get_intensity_image)
def test_invalid(): ps = regionprops(SAMPLE) def get_intensity_image(): ps[0].intensity_image with pytest.raises(AttributeError): get_intensity_image()
def test_old_dict_interface(): feats = regionprops(SAMPLE, ['Area', 'Eccentricity', 'EulerNumber', 'Extent', 'MinIntensity', 'MeanIntensity', 'MaxIntensity', 'Solidity'], intensity_image=INTENSITY_SAMPLE) np.array([list(props.values()) for props in feats], np.float) assert_equal(len(feats[0]), 8)
def test_moments_normalized(): nu = regionprops(SAMPLE)[0].moments_normalized # determined with OpenCV assert_almost_equal(nu[0,2], 0.08410493827160502) assert_almost_equal(nu[1,1], -0.016846707818929982) assert_almost_equal(nu[1,2], -0.002899800614433943) assert_almost_equal(nu[2,0], 0.24301268861454037) assert_almost_equal(nu[2,1], 0.045473992910668816) assert_almost_equal(nu[3,0], -0.017278118992041805)
def test_weighted_moments_normalized(): wnu = regionprops(SAMPLE, intensity_image=INTENSITY_SAMPLE )[0].weighted_moments_normalized ref = np.array( [[ np.nan, np.nan, 0.0873590903, -0.0161217406], [ np.nan, -0.0160405109, -0.0031421072, -0.0031376984], [ 0.230146783, 0.0457932622, 0.0165315478, 0.0043903193], [-0.0162529732, -0.0104598869, -0.0028544152, -0.0011057191]] ) assert_array_almost_equal(wnu, ref)
def test_weighted_moments(): wm = regionprops(SAMPLE, intensity_image=INTENSITY_SAMPLE )[0].weighted_moments ref = np.array( [[7.4000000e+01, 4.1000000e+02, 2.7500000e+03, 1.9778000e+04], [6.9900000e+02, 3.7850000e+03, 2.4855000e+04, 1.7500100e+05], [7.8630000e+03, 4.4063000e+04, 2.9347700e+05, 2.0810510e+06], [9.7317000e+04, 5.7256700e+05, 3.9007170e+06, 2.8078871e+07]] ) assert_array_almost_equal(wm, ref)
def test_moments_central(): mu = regionprops(SAMPLE)[0].moments_central # determined with OpenCV assert_almost_equal(mu[0,2], 436.00000000000045) # different from OpenCV results, bug in OpenCV assert_almost_equal(mu[0,3], -737.333333333333) assert_almost_equal(mu[1,1], -87.33333333333303) assert_almost_equal(mu[1,2], -127.5555555555593) assert_almost_equal(mu[2,0], 1259.7777777777774) assert_almost_equal(mu[2,1], 2000.296296296291) assert_almost_equal(mu[3,0], -760.0246913580195)
def test_weighted_moments_central(): wmu = regionprops(SAMPLE, intensity_image=INTENSITY_SAMPLE)[0].weighted_moments_central ref = np.array( [ [7.4000000000e01, -2.1316282073e-13, 4.7837837838e02, -7.5943608473e02], [3.7303493627e-14, -8.7837837838e01, -1.4801314828e02, -1.2714707125e03], [1.2602837838e03, 2.1571526662e03, 6.6989799420e03, 1.5304076361e04], [-7.6561796932e02, -4.2385971907e03, -9.9501164076e03, -3.3156729271e04], ] ) np.set_printoptions(precision=10) assert_array_almost_equal(wmu, ref)
def test_moments(): m = regionprops(SAMPLE)[0].moments # determined with OpenCV assert_almost_equal(m[0,0], 72.0) assert_almost_equal(m[0,1], 408.0) assert_almost_equal(m[0,2], 2748.0) assert_almost_equal(m[0,3], 19776.0) assert_almost_equal(m[1,0], 680.0) assert_almost_equal(m[1,1], 3766.0) assert_almost_equal(m[1,2], 24836.0) assert_almost_equal(m[2,0], 7682.0) assert_almost_equal(m[2,1], 43882.0) assert_almost_equal(m[3,0], 95588.0)
def test_weighted_moments_hu(): whu = regionprops(SAMPLE, intensity_image=INTENSITY_SAMPLE )[0].weighted_moments_hu ref = np.array([ 3.1750587329e-01, 2.1417517159e-02, 2.3609322038e-02, 1.2565683360e-03, 8.3014209421e-07, -3.5073773473e-05, 6.7936409056e-06 ]) assert_array_almost_equal(whu, ref)
def test_docstrings_and_props(): region = regionprops(SAMPLE)[0] docs = _parse_docs() props = [m for m in dir(region) if not m.startswith('_')] nr_docs_parsed = len(docs) nr_props = len(props) assert_equal(nr_docs_parsed, nr_props) ds = docs['weighted_moments_normalized'] assert 'iteration' not in ds assert len(ds.split('\n')) > 3
def test_moments_hu(): hu = regionprops(SAMPLE)[0].moments_hu ref = np.array([ 3.27117627e-01, 2.63869194e-02, 2.35390060e-02, 1.23151193e-03, 1.38882330e-06, -2.72586158e-05, 6.48350653e-06 ]) # bug in OpenCV caused in Central Moments calculation? assert_array_almost_equal(hu, ref)
def test_cache(): region = regionprops(SAMPLE)[0] f0 = region.filled_image region._label_image[:10] = 1 f1 = region.filled_image # Changed underlying image, but cache keeps result the same assert_array_equal(f0, f1) # Now invalidate cache region._cache_active = False f1 = region.filled_image assert np.any(f0 != f1)
def test_slice(): padded = np.pad(SAMPLE, ((2, 4), (5, 2)), mode='constant') nrow, ncol = SAMPLE.shape result = regionprops(padded)[0].slice expected = (slice(2, 2 + nrow), slice(5, 5 + ncol)) assert_equal(result, expected)
def test_extra_properties(): region = regionprops(SAMPLE, extra_properties=(pixelcount, ))[0] assert region.pixelcount == np.sum(SAMPLE == 1)
def test_invalid_size(): wrong_intensity_sample = np.array([[1], [1]]) with testing.raises(ValueError): regionprops(SAMPLE, wrong_intensity_sample)
def test_coordinates(): sample = np.zeros((10, 10), dtype=np.int8) coords = np.array([[3, 2], [3, 3], [3, 4]]) sample[coords[:, 0], coords[:, 1]] = 1 prop_coords = regionprops(sample)[0].coords assert_array_equal(prop_coords, coords)
def test_deprecated_coords_argument(): with expected_warnings(['coordinates keyword argument']): region = regionprops(SAMPLE, coordinates='rc') with testing.raises(ValueError): region = regionprops(SAMPLE, coordinates='xy')
def test_filled_image(): img = regionprops(SAMPLE)[0].filled_image assert_array_equal(img, SAMPLE)
def test_ndim(): regionprops(np.zeros((10, 10), dtype=np.int)) regionprops(np.zeros((10, 10, 1), dtype=np.int)) regionprops(np.zeros((10, 10, 1, 1), dtype=np.int)) assert_raises(TypeError, regionprops, np.zeros((10, 10, 2), dtype=np.int))
def test_ndim(): regionprops(np.zeros((10, 10), dtype=np.int)) regionprops(np.zeros((10, 10, 1), dtype=np.int)) regionprops(np.zeros((10, 10, 10), dtype=np.int)) regionprops(np.zeros((1, 1), dtype=np.int)) regionprops(np.zeros((1, 1, 1), dtype=np.int)) with testing.raises(TypeError): regionprops(np.zeros((10, 10, 10, 2), dtype=np.int))
def test_min_intensity(): intensity = regionprops(SAMPLE, intensity_image=INTENSITY_SAMPLE)[0].min_intensity assert_almost_equal(intensity, 1)
def test_convex_area(): area = regionprops(SAMPLE)[0].convex_area # determined with MATLAB assert area == 124
def test_centroid_3d(): centroid = regionprops(SAMPLE_3D)[0].centroid # determined by mean along axis 1 of SAMPLE_3D.nonzero() assert_array_almost_equal(centroid, (1.66666667, 1.55555556, 1.55555556))
def test_centroid(): centroid = regionprops(SAMPLE)[0].centroid # determined with MATLAB assert_array_almost_equal(centroid, (5.66666666666666, 9.444444444444444))
def test_bbox_area(): padded = np.pad(SAMPLE, 5, mode='constant') bbox_area = regionprops(padded)[0].bbox_area assert_array_almost_equal(bbox_area, SAMPLE.size)
def test_label_sequence(): a = np.empty((2, 2), dtype=np.int) a[:, :] = 2 ps = regionprops(a) assert len(ps) == 1 assert ps[0].label == 2
def test_minor_axis_length(): length = regionprops(SAMPLE)[0].minor_axis_length # MATLAB has different interpretation of ellipse than found in literature, # here implemented as found in literature assert_almost_equal(length, 9.739302807263)
def test_equiv_diameter(): diameter = regionprops(SAMPLE)[0].equivalent_diameter # determined with MATLAB assert_almost_equal(diameter, 9.57461472963)
def test_major_axis_length(): length = regionprops(SAMPLE)[0].major_axis_length # MATLAB has different interpretation of ellipse than found in literature, # here implemented as found in literature assert_almost_equal(length, 16.7924234999)
def test_extent(): extent = regionprops(SAMPLE)[0].extent assert_almost_equal(extent, 0.4)
def test_all_props(): region = regionprops(SAMPLE, INTENSITY_SAMPLE)[0] for prop in PROPS: assert_almost_equal(region[prop], getattr(region, PROPS[prop]))
def test_image(): img = regionprops(SAMPLE)[0].image assert_array_equal(img, SAMPLE) img = regionprops(SAMPLE_3D)[0].image assert_array_equal(img, SAMPLE_3D[1:4, 1:3, 1:3])
def test_feret_diameter_max_3d(): img = np.zeros((20, 20), dtype=np.uint8) img[2:-2, 2:-2] = 1 img_3d = np.dstack((img, ) * 3) feret_diameter_max = regionprops(img_3d)[0].feret_diameter_max assert np.abs(feret_diameter_max - 16 * np.sqrt(2)) < 1
def test_extra_properties_no_intensity_provided(): with testing.raises(AttributeError): region = regionprops(SAMPLE, extra_properties=(median_intensity, ))[0] _ = region.median_intensity
def test_label(): label = regionprops(SAMPLE)[0].label assert_array_equal(label, 1) label = regionprops(SAMPLE_3D)[0].label assert_array_equal(label, 1)
def test_props_dict_complete(): region = regionprops(SAMPLE)[0] properties = [s for s in dir(region) if not s.startswith('_')] assert set(properties) == set(PROPS.values())
def test_weighted_centroid(): centroid = regionprops( SAMPLE, intensity_image=INTENSITY_SAMPLE)[0].weighted_centroid assert_array_almost_equal(centroid, (5.540540540540, 9.445945945945))
def test_solidity(): solidity = regionprops(SAMPLE)[0].solidity # determined with MATLAB assert_almost_equal(solidity, 0.580645161290323)
def test_extra_properties_intensity(): region = regionprops(SAMPLE, intensity_image=INTENSITY_SAMPLE, extra_properties=(median_intensity, ))[0] assert region.median_intensity == np.median(INTENSITY_SAMPLE[SAMPLE == 1])
def test_perimeter(): per = regionprops(SAMPLE)[0].perimeter assert_almost_equal(per, 55.2487373415) per = perimeter(SAMPLE.astype('double'), neighbourhood=8) assert_almost_equal(per, 46.8284271247)
def test_area(): area = regionprops(SAMPLE)[0].area assert area == np.sum(SAMPLE) area = regionprops(SAMPLE_3D)[0].area assert area == np.sum(SAMPLE_3D)
def test_pure_background(): a = np.zeros((2, 2), dtype=np.int) ps = regionprops(a) assert len(ps) == 0