mirror of
https://github.com/wassname/scikit-image.git
synced 2026-07-10 22:34:17 +08:00
Use boolean mask for inlier return value of RANSAC
This commit is contained in:
@@ -105,6 +105,7 @@ model.estimate(src, dst)
|
||||
# robustly estimate affine transform model with RANSAC
|
||||
model_robust, inliers = ransac((src, dst), AffineTransform, min_samples=3,
|
||||
residual_threshold=2, max_trials=100)
|
||||
outliers = inliers == False
|
||||
|
||||
|
||||
# compare "true" and estimated transform parameters
|
||||
@@ -128,16 +129,11 @@ ax[1].axis('off')
|
||||
ax[1].axis((0, 400, 200, 0))
|
||||
ax[1].set_title('Faulty correspondencies')
|
||||
|
||||
for i in range(len(src)):
|
||||
if i in inliers:
|
||||
ax_idx = 0
|
||||
color = 'g'
|
||||
else:
|
||||
ax_idx = 1
|
||||
color = 'r'
|
||||
ax[ax_idx].plot((src[i, 1], dst[i, 1] + 200), (src[i, 0], dst[i, 0]), '-',
|
||||
|
||||
for ax_idx, (m, color) in enumerate(((inliers, 'g'), (outliers, 'r'))):
|
||||
ax[ax_idx].plot((src[m, 1], dst[m, 1] + 200), (src[m, 0], dst[m, 0]), '-',
|
||||
color=color)
|
||||
ax[ax_idx].plot(src[i, 1], src[i, 0], '.', markersize=10, color=color)
|
||||
ax[ax_idx].plot(dst[i, 1] + 200, dst[i, 0], '.', markersize=10, color=color)
|
||||
ax[ax_idx].plot(src[m, 1], src[m, 0], '.', markersize=10, color=color)
|
||||
ax[ax_idx].plot(dst[m, 1] + 200, dst[m, 0], '.', markersize=10, color=color)
|
||||
|
||||
plt.show()
|
||||
|
||||
@@ -517,7 +517,7 @@ def ransac(data, model_class, min_samples, residual_threshold,
|
||||
model : object
|
||||
Best model with largest consensus set.
|
||||
inliers : (N, ) array
|
||||
Indices of inliers.
|
||||
Boolean mask of inliers classified as ``True``.
|
||||
|
||||
References
|
||||
----------
|
||||
@@ -598,8 +598,6 @@ def ransac(data, model_class, min_samples, residual_threshold,
|
||||
# number of samples
|
||||
N = data[0].shape[0]
|
||||
|
||||
data_idxs = np.arange(N)
|
||||
|
||||
for _ in range(max_trials):
|
||||
|
||||
# choose random sample set
|
||||
@@ -623,12 +621,11 @@ def ransac(data, model_class, min_samples, residual_threshold,
|
||||
|
||||
sample_model_residuals = np.abs(sample_model.residuals(*data))
|
||||
# consensus set / inliers
|
||||
sample_model_inliers = data_idxs[sample_model_residuals
|
||||
< residual_threshold]
|
||||
sample_model_inliers = sample_model_residuals < residual_threshold
|
||||
sample_model_residuals_sum = np.sum(sample_model_residuals**2)
|
||||
|
||||
# choose as new best model if number of inliers is maximal
|
||||
sample_inlier_num = sample_model_inliers.shape[0]
|
||||
sample_inlier_num = np.sum(sample_model_inliers)
|
||||
if (
|
||||
# more inliers
|
||||
sample_inlier_num > best_inlier_num
|
||||
|
||||
@@ -167,17 +167,16 @@ def test_ransac_geometric():
|
||||
|
||||
# add some faulty data
|
||||
outliers = (0, 5, 20)
|
||||
dst[0] = (10000, 10000)
|
||||
dst[1] = (-100, 100)
|
||||
dst[2] = (50, 50)
|
||||
dst[outliers[0]] = (10000, 10000)
|
||||
dst[outliers[1]] = (-100, 100)
|
||||
dst[outliers[2]] = (50, 50)
|
||||
|
||||
# estimate parameters of corrupted data
|
||||
model_est, inliers = ransac((src, dst), AffineTransform, 2, 10)
|
||||
model_est, inliers = ransac((src, dst), AffineTransform, 2, 20)
|
||||
|
||||
# test whether estimated parameters equal original parameters
|
||||
assert_almost_equal(model0._matrix, model_est._matrix)
|
||||
for outlier in outliers:
|
||||
assert outlier not in inliers
|
||||
assert np.all(np.nonzero(inliers == False)[0] == outliers)
|
||||
|
||||
|
||||
def test_ransac_is_data_valid():
|
||||
|
||||
Reference in New Issue
Block a user