mirror of
https://github.com/wassname/scikit-image.git
synced 2026-06-28 23:10:03 +08:00
41 lines
1.3 KiB
Python
41 lines
1.3 KiB
Python
"""
|
|
============================================
|
|
Robust 3D line model estimation using RANSAC
|
|
============================================
|
|
|
|
In this example we see how to robustly fit a 3D line model to faulty data using
|
|
the RANSAC algorithm.
|
|
|
|
"""
|
|
import numpy as np
|
|
from matplotlib import pyplot as plt
|
|
from mpl_toolkits.mplot3d import Axes3D
|
|
from skimage.measure import LineModelND, ransac
|
|
|
|
np.random.seed(seed=1)
|
|
|
|
# generate coordinates of line
|
|
point = np.array([0, 0, 0], dtype='float')
|
|
direction = np.array([1, 1, 1], dtype='float') / np.sqrt(3)
|
|
xyz = point + 10 * np.arange(-100, 100)[..., np.newaxis] * direction
|
|
|
|
# add gaussian noise to coordinates
|
|
noise = np.random.normal(size=xyz.shape)
|
|
xyz += 0.5 * noise
|
|
xyz[::2] += 20 * noise[::2]
|
|
xyz[::4] += 100 * noise[::4]
|
|
|
|
# robustly fit line only using inlier data with RANSAC algorithm
|
|
model_robust, inliers = ransac(xyz, LineModelND, min_samples=2,
|
|
residual_threshold=1, max_trials=1000)
|
|
outliers = inliers == False
|
|
|
|
fig = plt.figure()
|
|
ax = fig.add_subplot(111, projection='3d')
|
|
ax.scatter(xyz[inliers][:, 0], xyz[inliers][:, 1], xyz[inliers][:, 2], c='b',
|
|
marker='o', label='Inlier data')
|
|
ax.scatter(xyz[outliers][:, 0], xyz[outliers][:, 1], xyz[outliers][:, 2], c='r',
|
|
marker='o', label='Outlier data')
|
|
ax.legend(loc='lower left')
|
|
plt.show()
|