Skip to content
Snippets Groups Projects
Commit 83d370fd authored by many's avatar many
Browse files

optimizer improvements - but still not reliable?

parent b8756e88
No related branches found
No related tags found
1 merge request!62Cleanup 0.2.0
Pipeline #17547 failed
...@@ -12,6 +12,8 @@ from ntrfc.geometry.line import lines_from_points ...@@ -12,6 +12,8 @@ from ntrfc.geometry.line import lines_from_points
from ntrfc.turbo.pointcloud_methods import extractSidePolys, midline_from_sides from ntrfc.turbo.pointcloud_methods import extractSidePolys, midline_from_sides
from ntrfc.math.vectorcalc import findNearest, vecDir from ntrfc.math.vectorcalc import findNearest, vecDir
from scipy.optimize import differential_evolution from scipy.optimize import differential_evolution
from dataclasses import dataclass
def detect_inliers_tukey(data): def detect_inliers_tukey(data):
""" """
Detect inliers using Tukey's method. Detect inliers using Tukey's method.
...@@ -133,17 +135,19 @@ def extract_vk_hk(sortedPoly: pv.PolyData) -> (int, int): ...@@ -133,17 +135,19 @@ def extract_vk_hk(sortedPoly: pv.PolyData) -> (int, int):
valid_midline = clean_sites(voronoi_sites, skeletonize_sites) valid_midline = clean_sites(voronoi_sites, skeletonize_sites)
sort_indices = np.argsort(valid_midline[:, 0]) sort_indices = np.argsort(valid_midline[:, 0])
valid_midline_sorted = valid_midline[sort_indices] valid_midline_sorted = valid_midline[sort_indices]
smoothing = 0.01 smoothing = 0.00001
u_new = np.arange(0, 1, 1 / 1024) u_new = np.arange(0, 1, 1 / 1024)
(tck, u), fp, ier, msg = splprep((valid_midline_sorted[::, 0], valid_midline_sorted[::, 1]), u=None, per=0, k=3, (tck, u), fp, ier, msg = splprep((valid_midline_sorted[::, 0], valid_midline_sorted[::, 1]), u=None, per=0, k=3,
s=smoothing, s=smoothing,
full_output=True) # s = optional parameter (default used here) full_output=True) # s = optional parameter (default used here)
x_new, y_new = splev(u_new, tck, der=0) x_new, y_new = splev(u_new, tck, der=0)
le_ind, te_ind, skeletonline_complete = skeletonline_completion(2, points_orig, points_2d_closed_refined_voronoi, le_ind, te_ind, skeletonline_complete = skeletonline_completion(2, points_orig, points_2d_closed_refined_voronoi,
np.stack([x_new[1:-1], y_new[1:-1]]).T) np.stack([x_new, y_new]).T)
rms_error = compute_midline_error(le_ind, te_ind,sortedPoly,shapelypoly) rms_error_ref = compute_midline_error(le_ind, te_ind,sortedPoly,shapelypoly)
# Define the objective function # Define the objective function
def objective_function(indices, sortedPoly, shapelypoly): def objective_function(indices, sortedPoly, shapelypoly):
...@@ -151,32 +155,95 @@ def extract_vk_hk(sortedPoly: pv.PolyData) -> (int, int): ...@@ -151,32 +155,95 @@ def extract_vk_hk(sortedPoly: pv.PolyData) -> (int, int):
rms_error_le_up = compute_midline_error(le_ind, te_ind, sortedPoly, shapelypoly) rms_error_le_up = compute_midline_error(le_ind, te_ind, sortedPoly, shapelypoly)
return rms_error_le_up return rms_error_le_up
le_search_interval = 6 @dataclass
te_search_interval = 6 class SkeletonResult:
le_ind: int
le_min = (le_ind - le_search_interval) % npts te_ind: int
te_min = (te_ind - te_search_interval) % npts rms_error: float
# le_max = (le_ind + 20) % npts
# te_max = (te_ind + 20) % npts # optimize te
search_te_pos = 3
allowed_le = [(i+le_min)% npts for i in range(2*le_search_interval)] te_pos_ind = te_ind
allowed_te = [(i+te_min)% npts for i in range(2*te_search_interval)] search_te_neg = 3
te_neg_ind = te_ind
specific_combinations = np.array(np.meshgrid(allowed_le, allowed_te)).T.reshape(-1, 2) search_le_pos = 3
le_pos_ind = le_ind
# Initialize the best values search_le_neg = 3
best_combination = None le_neg_ind = le_ind
best_rms_error = float('inf') search_le_neg_te_pos = 3
le_neg_te_pos_le_ind = le_ind
# Evaluate the objective function for each combination le_neg_te_pos_te_ind = te_ind
for indices in specific_combinations: search_le_pos_te_neg = 3
rms_error = objective_function(indices, sortedPoly, shapelypoly) le_pos_te_neg_le_ind = le_ind
if rms_error < best_rms_error: le_pos_te_neg_te_ind = te_ind
best_rms_error = rms_error search_le_neg_te_neg = 3
best_combination = indices le_neg_te_neg_le_ind = le_ind
le_neg_te_neg_te_ind = te_ind
le_ind_best, te_ind_best = best_combination search_le_pos_te_pos = 3
le_pos_te_pos_le_ind = le_ind
le_pos_te_pos_te_ind = te_ind
skeletonresults = []
skeletonresults.append(SkeletonResult(le_ind, te_ind, rms_error_ref))
while search_te_pos > 0:
te_pos_ind = (te_pos_ind + 1) % npts
rms_error_te_pos = objective_function([le_ind, te_pos_ind], sortedPoly, shapelypoly)
skeletonresults.append(SkeletonResult(le_ind, te_pos_ind, rms_error_te_pos))
if rms_error_te_pos > rms_error_ref:
search_te_pos -= 1
while search_te_neg > 0:
te_neg_ind = (te_neg_ind - 1) % npts
rms_error_te_neg = objective_function([le_ind, te_neg_ind], sortedPoly, shapelypoly)
skeletonresults.append(SkeletonResult(le_ind, te_neg_ind, rms_error_te_neg))
if rms_error_te_neg > rms_error_ref:
search_te_neg -= 1
while search_le_pos > 0:
le_pos_ind = (le_pos_ind + 1) % npts
rms_error_le_pos = objective_function([le_pos_ind, te_ind], sortedPoly, shapelypoly)
skeletonresults.append(SkeletonResult(le_pos_ind, te_ind, rms_error_le_pos))
if rms_error_le_pos > rms_error_ref:
search_le_pos -= 1
while search_le_neg > 0:
le_neg_ind = (le_neg_ind - 1) % npts
rms_error_le_neg = objective_function([le_neg_ind, te_ind], sortedPoly, shapelypoly)
skeletonresults.append(SkeletonResult(le_neg_ind, te_ind, rms_error_le_neg))
if rms_error_le_neg > rms_error_ref:
search_le_neg -= 1
while search_le_neg_te_pos > 0:
le_neg_te_pos_le_ind = (le_neg_te_pos_le_ind - 1) % npts
le_neg_te_pos_te_ind = (le_neg_te_pos_te_ind + 1) % npts
rms_error_le_neg_te_pos = objective_function([le_neg_te_pos_le_ind, le_neg_te_pos_te_ind], sortedPoly, shapelypoly)
skeletonresults.append(SkeletonResult(le_neg_te_pos_le_ind, le_neg_te_pos_te_ind, rms_error_le_neg_te_pos))
if rms_error_le_neg_te_pos > rms_error_ref:
search_le_neg_te_pos -= 1
while search_le_pos_te_neg > 0:
le_pos_te_neg_le_ind = (le_pos_te_neg_le_ind + 1) % npts
le_pos_te_neg_te_ind = (le_pos_te_neg_te_ind - 1) % npts
rms_error_le_pos_te_neg = objective_function([le_pos_te_neg_le_ind, le_pos_te_neg_te_ind], sortedPoly, shapelypoly)
skeletonresults.append(SkeletonResult(le_pos_te_neg_le_ind, le_pos_te_neg_te_ind, rms_error_le_pos_te_neg))
if rms_error_le_pos_te_neg > rms_error_ref:
search_le_pos_te_neg -= 1
while search_le_neg_te_neg > 0:
le_neg_te_neg_le_ind = (le_neg_te_neg_le_ind - 1) % npts
le_neg_te_neg_te_ind = (le_neg_te_neg_te_ind - 1) % npts
rms_error_le_neg_te_neg = objective_function([le_neg_te_neg_le_ind, le_neg_te_neg_te_ind], sortedPoly, shapelypoly)
skeletonresults.append(SkeletonResult(le_neg_te_neg_le_ind, le_neg_te_neg_te_ind, rms_error_le_neg_te_neg))
if rms_error_le_neg_te_neg > rms_error_ref:
search_le_neg_te_neg -= 1
while search_le_pos_te_pos > 0:
le_pos_te_pos_le_ind = (le_pos_te_pos_le_ind + 1) % npts
le_pos_te_pos_te_ind = (le_pos_te_pos_te_ind + 1) % npts
rms_error_le_pos_te_pos = objective_function([le_pos_te_pos_le_ind, le_pos_te_pos_te_ind], sortedPoly, shapelypoly)
skeletonresults.append(SkeletonResult(le_pos_te_pos_le_ind, le_pos_te_pos_te_ind, rms_error_le_pos_te_pos))
if rms_error_le_pos_te_pos > rms_error_ref:
search_le_pos_te_pos -= 1
best_combination = min(skeletonresults, key=lambda x: x.rms_error)
le_ind_best, te_ind_best = best_combination.le_ind, best_combination.te_ind
return le_ind_best, te_ind_best return le_ind_best, te_ind_best
...@@ -268,6 +335,8 @@ def polygon_to_binary_image(polygon, image_size): ...@@ -268,6 +335,8 @@ def polygon_to_binary_image(polygon, image_size):
def compute_midline(polygon, image_size): def compute_midline(polygon, image_size):
# Convert polygon to binary image # Convert polygon to binary image
binary_img = polygon_to_binary_image(polygon, image_size) binary_img = polygon_to_binary_image(polygon, image_size)
# crop all-zero rows of the binary_img
binary_img = binary_img[~np.all(binary_img == 0, axis=1)]
# Apply skeletonization # Apply skeletonization
skeleton = skeletonize(binary_img, method='lee') skeleton = skeletonize(binary_img, method='lee')
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment