mirror of
https://github.com/wassname/scikit-image.git
synced 2026-06-29 03:37:34 +08:00
040a53456d
- model.params holds the legacy params (2D representation), - model.new_params holds the true ND line representation. The proposed LineModel behaves identically as the implementation in master in the 2D case. In the 3D case, it behaves similarly to the previously proposed LineModel3D, as long as new_params is used instead of params. This implementation thus takes advantage that the 2D case is a special case of the ND general model.
41 lines
1.3 KiB
Python
41 lines
1.3 KiB
Python
"""
|
|
=========================================
|
|
Robust 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 LineModel, 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, LineModel, 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()
|