From 3b69f5788f2381ad81a89b157dc0727535447e25 Mon Sep 17 00:00:00 2001 From: Alan Morris Date: Thu, 5 Mar 2026 18:07:17 -0700 Subject: [PATCH] Add Laplacian warp method for MeshWarper Add Laplacian surface deformation as an alternative to biharmonic mesh warping. Laplacian warping preserves local curvature during deformation, reducing artificial thinning in regions with sparse particle coverage. - Implement Laplacian warp in MeshWarper using igl::cotmatrix and igl::min_quad_with_fixed (no new CMake dependencies) - Add WarpMethod enum (Laplacian, Biharmonic) with Biharmonic as default - Add warp method selector to Studio Analysis panel and Preferences - Add Python bindings for WarpMethod enum and setter/getter - Fix Analysis tab sizing to reduce empty space when content is hidden - Fix clipped text for radio buttons and labels in Analysis UI - Add surface reconstruction docs page with comparison screenshots - Add warp method tests and benchmark to MeshTests --- Applications/shapeworks/MeshCommands.cpp | 2 +- Libs/Mesh/MeshWarper.cpp | 152 +++++++++++++++++- Libs/Mesh/MeshWarper.h | 35 +++- Libs/Python/ShapeworksPython.cpp | 20 ++- Studio/Analysis/AnalysisTool.cpp | 46 +++++- Studio/Analysis/AnalysisTool.h | 2 + Studio/Analysis/AnalysisTool.ui | 129 +++++++-------- Studio/Data/Preferences.cpp | 6 + Studio/Data/Preferences.h | 3 + Studio/Data/PreferencesWindow.cpp | 4 + Studio/Data/PreferencesWindow.ui | 23 ++- Testing/MeshTests/MeshTests.cpp | 145 +++++++++++++++++ .../surface_reconstruction_biharmonic.jpg | Bin 0 -> 31920 bytes .../surface_reconstruction_laplacian.jpg | Bin 0 -> 36262 bytes .../images/surface_reconstruction_panel.png | Bin 0 -> 68881 bytes docs/studio/studio-analyze.md | 14 +- docs/studio/surface-reconstruction.md | 81 ++++++++++ mkdocs.yml | 1 + 18 files changed, 573 insertions(+), 90 deletions(-) create mode 100644 docs/studio/images/surface_reconstruction_biharmonic.jpg create mode 100644 docs/studio/images/surface_reconstruction_laplacian.jpg create mode 100644 docs/studio/images/surface_reconstruction_panel.png create mode 100644 docs/studio/surface-reconstruction.md diff --git a/Applications/shapeworks/MeshCommands.cpp b/Applications/shapeworks/MeshCommands.cpp index 19a374ddf6..a6aee4b1a2 100644 --- a/Applications/shapeworks/MeshCommands.cpp +++ b/Applications/shapeworks/MeshCommands.cpp @@ -1505,7 +1505,7 @@ bool WarpMesh::execute(const optparse::Values &options, SharedCommandData &share Eigen::MatrixXd vertices_updated = output.points(); std::map landmarks_map = warper.get_landmarks_map(); - for (vtkIdType i = 0; i < warper.get_warp_matrix().rows(); i++) { + for (vtkIdType i = 0; i < vertices_updated.rows(); i++) { if (landmarks_map.count(i)) { // This vertex i corresponds to a landmark int landmark_index = landmarks_map.lower_bound(i)->second; diff --git a/Libs/Mesh/MeshWarper.cpp b/Libs/Mesh/MeshWarper.cpp index 0a2d18ba8d..cc066b71e9 100644 --- a/Libs/Mesh/MeshWarper.cpp +++ b/Libs/Mesh/MeshWarper.cpp @@ -2,10 +2,13 @@ #include #include #include +#include #include #include +#include #include #include +#include #include #include #include @@ -19,6 +22,7 @@ #include #include +#include namespace shapeworks { @@ -27,6 +31,7 @@ static std::mutex mutex; //--------------------------------------------------------------------------- vtkSmartPointer MeshWarper::build_mesh(const Eigen::MatrixXd& particles) { + TIME_SCOPE("MeshWarper::build_mesh"); if (!warp_available_) { return nullptr; } @@ -44,7 +49,8 @@ vtkSmartPointer MeshWarper::build_mesh(const Eigen::MatrixXd& parti auto points = remove_bad_particles(particles); - vtkSmartPointer poly_data = MeshWarper::warp_mesh(points); + vtkSmartPointer poly_data = + laplacian_ready_ ? MeshWarper::warp_mesh_laplacian(points) : MeshWarper::warp_mesh(points); for (int i = 0; i < poly_data->GetNumberOfPoints(); i++) { double* p = poly_data->GetPoint(i); @@ -81,6 +87,7 @@ void MeshWarper::set_reference_mesh(vtkSmartPointer reference_mesh, // mark that the warp needs to be generated needs_warp_ = true; + laplacian_ready_ = false; warp_available_ = true; @@ -372,6 +379,7 @@ void MeshWarper::split_cell_on_edge(int cell_id, int new_vertex, int v0, int v1, //--------------------------------------------------------------------------- bool MeshWarper::generate_warp() { + TIME_SCOPE("MeshWarper::generate_warp"); if (is_contour_) { update_progress(1.0); needs_warp_ = false; @@ -414,6 +422,15 @@ bool MeshWarper::generate_warp() { faces_ = reference_mesh.faces(); // Perform warp + if (warp_method_ == WarpMethod::Laplacian) { + if (generate_laplacian_warp(vertices, faces_, vertices_)) { + update_progress(1.0); + needs_warp_ = false; + return true; + } + SW_DEBUG("Laplacian warp failed, falling back to biharmonic"); + } + if (MeshWarper::generate_warp_matrix(vertices, faces_, vertices_, warp_)) { // Success! update_progress(1.0); @@ -422,7 +439,7 @@ bool MeshWarper::generate_warp() { } } - SW_ERROR("Mesh Warp Error: igl:biharmonic_coordinates failed"); + SW_ERROR("Mesh Warp Error: warp generation failed"); // All attempts failed update_progress(1.0); @@ -433,6 +450,7 @@ bool MeshWarper::generate_warp() { //--------------------------------------------------------------------------- bool MeshWarper::generate_warp_matrix(Eigen::MatrixXd target_vertices, Eigen::MatrixXi target_faces, const Eigen::MatrixXd& references_vertices, Eigen::MatrixXd& warp) { + TIME_SCOPE("MeshWarper::generate_warp_matrix (biharmonic)"); Eigen::VectorXi closest_vertex_indices; Eigen::VectorXi vertex_indices = Eigen::VectorXi::LinSpaced(target_vertices.rows(), 0, target_vertices.rows() - 1); @@ -480,6 +498,7 @@ bool MeshWarper::find_landmarks_vertices_on_ref_mesh() { //--------------------------------------------------------------------------- vtkSmartPointer MeshWarper::warp_mesh(const Eigen::MatrixXd& points) { + TIME_SCOPE("MeshWarper::warp_mesh (biharmonic)"); int num_vertices = warp_.rows(); int num_faces = faces_.rows(); Eigen::MatrixXd v_out = warp_ * (points.rowwise() + Eigen::RowVector3d(0, 0, 0)); @@ -502,6 +521,135 @@ vtkSmartPointer MeshWarper::warp_mesh(const Eigen::MatrixXd& points return poly_data; } +//--------------------------------------------------------------------------- +int MeshWarper::get_num_warp_vertices() const { + if (laplacian_ready_) { + return laplacian_vertices_.rows(); + } + return warp_.rows(); +} + +//--------------------------------------------------------------------------- +bool MeshWarper::generate_laplacian_warp(const Eigen::MatrixXd& V, const Eigen::MatrixXi& F, + const Eigen::MatrixXd& control_points) { + TIME_SCOPE("MeshWarper::generate_laplacian_warp"); + // Map control points to closest mesh vertices + Eigen::VectorXi vertex_indices = Eigen::VectorXi::LinSpaced(V.rows(), 0, V.rows() - 1); + Eigen::VectorXd squared_distances; + Eigen::MatrixXd unused_closest_points; + Eigen::VectorXi closest_vertex_indices; + igl::point_mesh_squared_distance(control_points, V, vertex_indices, squared_distances, closest_vertex_indices, + unused_closest_points); + + // Deduplicate handle indices + std::set handle_set(closest_vertex_indices.data(), + closest_vertex_indices.data() + closest_vertex_indices.size()); + laplacian_handles_.resize(handle_set.size()); + int idx = 0; + for (int h : handle_set) { + laplacian_handles_(idx++) = h; + } + + // Build cotangent Laplacian + Eigen::SparseMatrix L; + igl::cotmatrix(V, F, L); + + // Q = L^T * L (bilaplacian energy) + Eigen::SparseMatrix Q = L.transpose() * L; + + // Precompute factorization with fixed handle constraints + Eigen::SparseMatrix Aeq; // empty equality constraints + if (!igl::min_quad_with_fixed_precompute(Q, laplacian_handles_, Aeq, true, mqwf_data_)) { + SW_DEBUG("Laplacian precompute failed"); + return false; + } + + // Store constant RHS: B = -Q * V_ref (the linear term for the unconstrained part) + laplacian_rhs_ = -Q * V; + + // Store reference vertices + laplacian_vertices_ = V; + + // Precompute handle_map_: a sparse matrix (num_handles x num_controls) that maps + // control point positions to handle Y rows, averaging when multiple controls map to the same handle. + // Also precompute handle_default_: reference positions for handles with no control point. + int num_handles = laplacian_handles_.size(); + int num_controls = closest_vertex_indices.size(); + + // Build a map from vertex id to handle index + std::unordered_map vertex_to_handle; + for (int i = 0; i < num_handles; i++) { + vertex_to_handle[laplacian_handles_(i)] = i; + } + + // Count how many controls map to each handle + Eigen::VectorXi handle_counts = Eigen::VectorXi::Zero(num_handles); + for (int i = 0; i < num_controls; i++) { + auto it = vertex_to_handle.find(closest_vertex_indices(i)); + if (it != vertex_to_handle.end()) { + handle_counts(it->second)++; + } + } + + // Build sparse matrix with weights = 1/count for averaging + std::vector> triplets; + triplets.reserve(num_controls); + for (int i = 0; i < num_controls; i++) { + auto it = vertex_to_handle.find(closest_vertex_indices(i)); + if (it != vertex_to_handle.end()) { + int h = it->second; + triplets.emplace_back(h, i, 1.0 / handle_counts(h)); + } + } + handle_map_.resize(num_handles, num_controls); + handle_map_.setFromTriplets(triplets.begin(), triplets.end()); + + // Default Y: reference positions for handles with no control point + handle_default_ = Eigen::MatrixXd::Zero(num_handles, 3); + for (int i = 0; i < num_handles; i++) { + if (handle_counts(i) == 0) { + handle_default_.row(i) = V.row(laplacian_handles_(i)); + } + } + + laplacian_ready_ = true; + return true; +} + +//--------------------------------------------------------------------------- +vtkSmartPointer MeshWarper::warp_mesh_laplacian(const Eigen::MatrixXd& points) { + TIME_SCOPE("MeshWarper::warp_mesh_laplacian"); + // Build Y from precomputed sparse map: Y = handle_map_ * points + handle_default_ + Eigen::MatrixXd Y = handle_map_ * points + handle_default_; + + Eigen::MatrixXd Beq; // empty + Eigen::MatrixXd Z; + if (!igl::min_quad_with_fixed_solve(mqwf_data_, laplacian_rhs_, Y, Beq, Z)) { + SW_ERROR("Laplacian solve failed"); + return warp_mesh(points); // fallback to biharmonic + } + + // Build VTK polydata from solved vertices + int num_vertices = Z.rows(); + int num_faces = faces_.rows(); + vtkSmartPointer poly_data = vtkSmartPointer::New(); + vtkSmartPointer out_points = vtkSmartPointer::New(); + out_points->SetNumberOfPoints(num_vertices); + for (vtkIdType i = 0; i < num_vertices; i++) { + out_points->SetPoint(i, Z(i, 0), Z(i, 1), Z(i, 2)); + } + vtkSmartPointer polys = vtkSmartPointer::New(); + for (vtkIdType i = 0; i < num_faces; i++) { + polys->InsertNextCell(3); + polys->InsertCellPoint(faces_(i, 0)); + polys->InsertCellPoint(faces_(i, 1)); + polys->InsertCellPoint(faces_(i, 2)); + } + poly_data->SetPoints(out_points); + poly_data->SetPolys(polys); + return poly_data; +} + //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- void MeshWarper::diagnose_biharmonic_failure(const Eigen::MatrixXd& TV, const Eigen::MatrixXi& TF, diff --git a/Libs/Mesh/MeshWarper.h b/Libs/Mesh/MeshWarper.h index 610cb2e95d..70ce57433e 100644 --- a/Libs/Mesh/MeshWarper.h +++ b/Libs/Mesh/MeshWarper.h @@ -7,6 +7,7 @@ * The MeshWarper provides an object to warp meshes for surface reconstruction */ +#include #include #include @@ -14,13 +15,16 @@ namespace shapeworks { +//! Warp method selection for MeshWarper +enum class WarpMethod { Laplacian, Biharmonic }; + /** * \class MeshWarper * \ingroup Group-Mesh * * This class implements mesh warping based on correspondence particles. - * Correspondence points are embedded into the mesh as new vertices (traingles split). Then a biharmonic deformation - * is used to warp the mesh to new sets of correspondence particles. + * Correspondence points are embedded into the mesh as new vertices (triangles split). Then a deformation + * (Laplacian or biharmonic) is used to warp the mesh to new sets of correspondence particles. * * It can optionally be used to warp landmarks along with the mesh by embedding them as vertices * @@ -66,6 +70,15 @@ class MeshWarper { //! Return the reference particles const Eigen::MatrixXd& get_reference_particles() const { return this->reference_particles_; } + //! Set the warp method (Laplacian or Biharmonic) + void set_warp_method(WarpMethod method) { warp_method_ = method; } + + //! Get the current warp method + WarpMethod get_warp_method() const { return warp_method_; } + + //! Return the number of vertices in the warped mesh + int get_num_warp_vertices() const; + protected: //! For overriding to handle progress updates virtual void update_progress(float p) {} @@ -103,6 +116,12 @@ class MeshWarper { void diagnose_biharmonic_failure(const Eigen::MatrixXd& TV, const Eigen::MatrixXi& TF, const std::vector>& S, int k); + //! Generate the Laplacian warp data + bool generate_laplacian_warp(const Eigen::MatrixXd& V, const Eigen::MatrixXi& F, + const Eigen::MatrixXd& control_points); + + //! Warp mesh using Laplacian deformation + vtkSmartPointer warp_mesh_laplacian(const Eigen::MatrixXd& points); // Members Eigen::MatrixXi faces_; @@ -126,5 +145,17 @@ class MeshWarper { Eigen::MatrixXd reference_particles_; //! Whether the reference is a contour bool is_contour_ = false; + + //! Selected warp method + WarpMethod warp_method_ = WarpMethod::Biharmonic; + + //! Laplacian solve data + igl::min_quad_with_fixed_data mqwf_data_; + Eigen::MatrixXd laplacian_rhs_; //!< Constant RHS term: -Q * V_ref (n x 3) + Eigen::MatrixXd laplacian_vertices_; //!< Reference surface vertices + Eigen::VectorXi laplacian_handles_; //!< Handle vertex indices + Eigen::SparseMatrix handle_map_; //!< Maps control points to handle Y rows (num_handles x num_controls) + Eigen::MatrixXd handle_default_; //!< Default Y for handles with no control point (num_handles x 3) + bool laplacian_ready_ = false; }; } // namespace shapeworks diff --git a/Libs/Python/ShapeworksPython.cpp b/Libs/Python/ShapeworksPython.cpp index ba606bcbf1..a63f18aa39 100644 --- a/Libs/Python/ShapeworksPython.cpp +++ b/Libs/Python/ShapeworksPython.cpp @@ -1112,6 +1112,12 @@ PYBIND11_MODULE(shapeworks_py, m) { ; + // WarpMethod enum + py::enum_(m, "WarpMethod") + .value("Laplacian", WarpMethod::Laplacian) + .value("Biharmonic", WarpMethod::Biharmonic) + .export_values(); + // MeshWarping py::class_(m, "MeshWarper") @@ -1177,7 +1183,19 @@ PYBIND11_MODULE(shapeworks_py, m) { [](MeshWarper& w, const Mesh& warped_mesh) -> decltype(auto) { return w.extract_landmarks(warped_mesh.getVTKMesh()); }, - "Extract the landmarks from the warped mesh and return the landmarks (matrix [Nx3])", "warped_mesh"_a); + "Extract the landmarks from the warped mesh and return the landmarks (matrix [Nx3])", "warped_mesh"_a) + + .def( + "setWarpMethod", [](MeshWarper& w, WarpMethod method) { w.set_warp_method(method); }, + "Set the warp method (WarpMethod.Laplacian or WarpMethod.Biharmonic)", "method"_a) + + .def( + "getWarpMethod", [](MeshWarper& w) -> decltype(auto) { return w.get_warp_method(); }, + "Return the current warp method.") + + .def( + "getNumWarpVertices", [](MeshWarper& w) -> decltype(auto) { return w.get_num_warp_vertices(); }, + "Return the number of vertices in the warped mesh."); // MeshUtils py::class_(m, "MeshUtils") diff --git a/Studio/Analysis/AnalysisTool.cpp b/Studio/Analysis/AnalysisTool.cpp index 0e9d6b52f9..98c7e7690a 100644 --- a/Studio/Analysis/AnalysisTool.cpp +++ b/Studio/Analysis/AnalysisTool.cpp @@ -23,6 +23,7 @@ #include #include +#include #include "ParticleAreaPanel.h" #include "ShapeScalarPanel.h" @@ -36,6 +37,7 @@ const std::string AnalysisTool::MODE_SINGLE_SAMPLE_C("single sample"); const std::string AnalysisTool::MODE_REGRESSION_C("regression"); constexpr auto MESH_WARP_TEMPLATE_INDEX = "mesh_warp_template_index"; +constexpr auto MESH_WARP_METHOD = "mesh_warp_method"; //--------------------------------------------------------------------------- //! Helper to extract x,y,z from x,y,z,scalar @@ -205,6 +207,8 @@ AnalysisTool::AnalysisTool(Preferences& prefs) : preferences_(prefs) { connect(ui_->mesh_warp_median_button, &QPushButton::clicked, this, &AnalysisTool::mesh_warp_median_clicked); connect(ui_->mesh_warp_sample_spinbox, qOverload(&QSpinBox::valueChanged), this, &AnalysisTool::mesh_warp_sample_changed); + connect(ui_->warp_method_combo, qOverload(&QComboBox::currentIndexChanged), this, + &AnalysisTool::mesh_warp_method_changed); connect(ui_->mesh_warp_run_button, &QPushButton::clicked, this, &AnalysisTool::mesh_warp_run_clicked); } @@ -914,6 +918,7 @@ void AnalysisTool::load_settings() { QString::number(static_cast(params.get("network_pvalue_threshold", 0.05)))); ui_->mesh_warp_sample_spinbox->setValue(params.get(MESH_WARP_TEMPLATE_INDEX, -1)); + ui_->warp_method_combo->setCurrentIndex(params.get(MESH_WARP_METHOD, preferences_.get_warp_method())); update_group_boxes(); ui_->group_combo->setCurrentText(QString::fromStdString(params.get("current_group", "-None-"))); @@ -1718,6 +1723,8 @@ void AnalysisTool::initialize_mesh_warper() { SW_ERROR("Unable to set reference mesh, groomed mesh is unavailable"); return; } + WarpMethod warp_method = ui_->warp_method_combo->currentIndex() == 0 ? WarpMethod::Laplacian : WarpMethod::Biharmonic; + auto meshes = mesh_group.meshes(); for (int i = 0; i < mesh_group.meshes().size(); i++) { Eigen::VectorXd particles = median_shape->get_particles().get_local_particles(i); @@ -1729,7 +1736,9 @@ void AnalysisTool::initialize_mesh_warper() { Mesh mesh(poly_data); median_shape->get_constraints(i).clipMesh(mesh); - session_->get_mesh_manager()->get_mesh_warper(i)->set_reference_mesh(mesh.getVTKMesh(), points); + auto warper = session_->get_mesh_manager()->get_mesh_warper(i); + warper->set_warp_method(warp_method); + warper->set_reference_mesh(mesh.getVTKMesh(), points); } } } @@ -1870,6 +1879,7 @@ void AnalysisTool::handle_lda_complete() { group_lda_job_->plot(ui_->lda_graph, left_group, right_group); ui_->lda_graph->setVisible(true); ui_->lda_hint_label->setVisible(true); + QTimer::singleShot(0, this, &AnalysisTool::resize_tab_to_current); } void AnalysisTool::handle_network_analysis_progress(int progress) { @@ -1909,15 +1919,17 @@ void AnalysisTool::group_analysis_combo_changed() { } if (index == 0) { // none ui_->group_analysis_stacked_widget->setVisible(false); - ui_->group_analysis_stacked_widget->setEnabled(false); + ui_->group_analysis_stacked_widget->setMaximumHeight(0); } else { ui_->group_analysis_stacked_widget->setCurrentIndex(index - 1); + ui_->group_analysis_stacked_widget->setMaximumHeight(QWIDGETSIZE_MAX); ui_->group_analysis_stacked_widget->setVisible(true); - ui_->group_analysis_stacked_widget->setEnabled(true); if (ui_->group_analysis_stacked_widget->currentWidget() == ui_->lda_page) { update_lda_graph(); } } + // Recalculate tab height since analysis content changed + QTimer::singleShot(0, this, &AnalysisTool::resize_tab_to_current); Q_EMIT update_view(); } @@ -2094,6 +2106,13 @@ void AnalysisTool::mesh_warp_sample_changed() { ui_->template_mesh_name_label->setText(QString::fromStdString(shapes[index]->get_subject()->get_display_name())); } +//--------------------------------------------------------------------------- +void AnalysisTool::mesh_warp_method_changed() { + auto params = session_->get_project()->get_parameters(Parameters::ANALYSIS_PARAMS); + params.set(MESH_WARP_METHOD, ui_->warp_method_combo->currentIndex()); + session_->get_project()->set_parameters(Parameters::ANALYSIS_PARAMS, params); +} + //--------------------------------------------------------------------------- void AnalysisTool::mesh_warp_run_clicked() { session_->handle_clear_cache(); @@ -2105,6 +2124,22 @@ void AnalysisTool::mesh_warp_run_clicked() { void AnalysisTool::handle_tab_changed() { stats_ready_ = false; compute_stats(); + + resize_tab_to_current(); +} + +void AnalysisTool::resize_tab_to_current() { + auto* current = ui_->tabWidget->currentWidget(); + if (!current) return; + + // Force Qt to recalculate layout so minimumSize reflects hidden/shown widgets + current->layout()->activate(); + int h = current->layout()->minimumSize().height(); + int tab_bar = ui_->tabWidget->tabBar()->sizeHint().height(); + // Add frame margins + int frame = ui_->tabWidget->height() - ui_->tabWidget->currentWidget()->height(); + if (frame < tab_bar) frame = tab_bar + 6; + ui_->tabWidget->setMaximumHeight(frame + h); } //--------------------------------------------------------------------------- @@ -2148,6 +2183,11 @@ void AnalysisTool::set_active(bool active) { } active_ = active; update_interface(); + if (active) { + handle_tab_changed(); + // Deferred recalculation after layout settles + QTimer::singleShot(0, this, &AnalysisTool::handle_tab_changed); + } } //--------------------------------------------------------------------------- diff --git a/Studio/Analysis/AnalysisTool.h b/Studio/Analysis/AnalysisTool.h index 33842f2fc7..c6f0dd8511 100644 --- a/Studio/Analysis/AnalysisTool.h +++ b/Studio/Analysis/AnalysisTool.h @@ -207,6 +207,7 @@ class AnalysisTool : public QWidget { // mesh warping options void mesh_warp_median_clicked(); void mesh_warp_sample_changed(); + void mesh_warp_method_changed(); void mesh_warp_run_clicked(); void handle_tab_changed(); @@ -221,6 +222,7 @@ class AnalysisTool : public QWidget { private: void compute_reconstructed_domain_transforms(); + void resize_tab_to_current(); bool active_ = false; diff --git a/Studio/Analysis/AnalysisTool.ui b/Studio/Analysis/AnalysisTool.ui index 2ac40def64..cb2237ba5a 100644 --- a/Studio/Analysis/AnalysisTool.ui +++ b/Studio/Analysis/AnalysisTool.ui @@ -1096,19 +1096,6 @@ QWidget#particles_panel { - - - - Qt::Vertical - - - - 20 - 40 - - - - @@ -1225,6 +1212,12 @@ QWidget#particles_panel { + + + 0 + 0 + + Groups @@ -1244,7 +1237,11 @@ QWidget#particles_panel { - + + + QAbstractScrollArea::AdjustToContents + + @@ -1678,19 +1675,6 @@ QWidget#particles_panel { - - - - Qt::Vertical - - - - 20 - 0 - - - - @@ -2202,7 +2186,7 @@ Reference Domain - + Surface reconstruction based on distance transforms and particles. @@ -2212,33 +2196,7 @@ Reference Domain - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - + Legacy surface reconstruction method that requires only particles @@ -2284,6 +2242,9 @@ Reference Domain 16777215 + + Qt::AlignCenter + 3 @@ -2316,6 +2277,9 @@ Reference Domain 16777215 + + Qt::AlignCenter + 90.000000000000000 @@ -2344,6 +2308,9 @@ Reference Domain 16777215 + + Qt::AlignCenter + 0.010000000000000 @@ -2385,7 +2352,7 @@ Reference Domain - + Surface reconstruction method that uses mesh warping from a median mesh and particle positions. @@ -2417,20 +2384,21 @@ Reference Domain - Template Sample: + Template: - - - - - - true + + + Qt::AlignCenter + + + + - Run Mesh Warp + Template Name: @@ -2441,10 +2409,34 @@ Reference Domain - - + + - Template Name: + Warp Method: + + + + + + + + Laplacian + + + + + Biharmonic + + + + + + + + true + + + Run Mesh Warp @@ -2599,6 +2591,9 @@ Reference Domain 16777215 + + Qt::AlignCenter + 180.000000000000000 diff --git a/Studio/Data/Preferences.cpp b/Studio/Data/Preferences.cpp index 8f1da93a96..63bba1c7ee 100644 --- a/Studio/Data/Preferences.cpp +++ b/Studio/Data/Preferences.cpp @@ -387,6 +387,12 @@ bool Preferences::get_telemetry_asked() { return settings_.value("General/teleme //----------------------------------------------------------------------------- void Preferences::set_telemetry_asked(bool asked) { settings_.setValue("General/telemetry_asked", asked); } +//----------------------------------------------------------------------------- +int Preferences::get_warp_method() { return settings_.value("Analysis/warp_method", 1).toInt(); } + +//----------------------------------------------------------------------------- +void Preferences::set_warp_method(int method) { settings_.setValue("Analysis/warp_method", method); } + //----------------------------------------------------------------------------- QStringList Preferences::get_pending_telemetry_events() { return settings_.value("Telemetry/pending_events").toStringList(); diff --git a/Studio/Data/Preferences.h b/Studio/Data/Preferences.h index ed60fb17da..6591bebf8d 100644 --- a/Studio/Data/Preferences.h +++ b/Studio/Data/Preferences.h @@ -130,6 +130,9 @@ class Preferences : public QObject { bool get_telemetry_asked(); void set_telemetry_asked(bool asked); + int get_warp_method(); + void set_warp_method(int method); + QStringList get_pending_telemetry_events(); void set_pending_telemetry_events(QStringList events); diff --git a/Studio/Data/PreferencesWindow.cpp b/Studio/Data/PreferencesWindow.cpp index 10ce75cf18..1729ab1ae4 100644 --- a/Studio/Data/PreferencesWindow.cpp +++ b/Studio/Data/PreferencesWindow.cpp @@ -54,6 +54,8 @@ PreferencesWindow::PreferencesWindow(QWidget* parent, Preferences& prefs) : pref connect(ui_->discrete_color_mode, &QCheckBox::toggled, this, &PreferencesWindow::save_to_preferences); connect(ui_->reverse_color_map, &QCheckBox::toggled, this, &PreferencesWindow::save_to_preferences); connect(ui_->auto_update_checkbox, &QCheckBox::toggled, this, &PreferencesWindow::save_to_preferences); + connect(ui_->warp_method, qOverload(&QComboBox::currentIndexChanged), this, + &PreferencesWindow::save_to_preferences); } //----------------------------------------------------------------------------- @@ -117,6 +119,7 @@ void PreferencesWindow::set_values_from_preferences() { ui_->auto_update_checkbox->setChecked(preferences_.get_auto_update_check()); ui_->telemetry_enabled->setChecked(preferences_.get_telemetry_enabled()); ui_->data_loader_num_workers->setText(QString::number(preferences_.get_dataloader_num_workers())); + ui_->warp_method->setCurrentIndex(preferences_.get_warp_method()); update_labels(); } @@ -149,6 +152,7 @@ void PreferencesWindow::save_to_preferences() { preferences_.set_auto_update_check(ui_->auto_update_checkbox->isChecked()); preferences_.set_telemetry_enabled(ui_->telemetry_enabled->isChecked()); preferences_.set_dataloader_num_workers(ui_->data_loader_num_workers->text().toInt()); + preferences_.set_warp_method(ui_->warp_method->currentIndex()); update_labels(); Q_EMIT update_view(); } diff --git a/Studio/Data/PreferencesWindow.ui b/Studio/Data/PreferencesWindow.ui index 9c79973764..a565aca98d 100644 --- a/Studio/Data/PreferencesWindow.ui +++ b/Studio/Data/PreferencesWindow.ui @@ -522,7 +522,28 @@ - + + + + Default Warp Method: + + + + + + + + Laplacian + + + + + Biharmonic + + + + + Qt::Vertical diff --git a/Testing/MeshTests/MeshTests.cpp b/Testing/MeshTests/MeshTests.cpp index d7d343e090..050fb81429 100644 --- a/Testing/MeshTests/MeshTests.cpp +++ b/Testing/MeshTests/MeshTests.cpp @@ -1,3 +1,4 @@ +#include #include #include "Image.h" @@ -715,6 +716,7 @@ void mesh_warp_test(std::string ref_mesh, std::string ref_particles, std::string movingPoints.transposeInPlace(); MeshWarper warper; + warper.set_warp_method(WarpMethod::Biharmonic); warper.set_reference_mesh(reference.getVTKMesh(), staticPoints); ASSERT_TRUE(warper.get_warp_available()); @@ -750,6 +752,149 @@ TEST(MeshTests, warpTest4) { // "/mesh_warp/lv_shared2_baseline.vtk"); //} +// Laplacian warp tests +TEST(MeshTests, laplacianWarpBasic) { + // Test that Laplacian warp succeeds and produces a valid mesh + Mesh reference(std::string(TEST_DATA_DIR) + "/ellipsoid_0.ply"); + + std::string staticPath = std::string(TEST_DATA_DIR) + "/ellipsoid_0.particles"; + std::string movingPath = std::string(TEST_DATA_DIR) + "/ellipsoid_1.particles"; + std::vector paths = {staticPath, movingPath}; + ParticleSystemEvaluation particlesystem(paths); + Eigen::MatrixXd allPts = particlesystem.get_matrix(); + Eigen::MatrixXd staticPoints = allPts.col(0); + Eigen::MatrixXd movingPoints = allPts.col(1); + + int numParticles = staticPoints.rows() / 3; + staticPoints.resize(3, numParticles); + staticPoints.transposeInPlace(); + movingPoints.resize(3, numParticles); + movingPoints.transposeInPlace(); + + MeshWarper warper; + warper.set_warp_method(WarpMethod::Laplacian); + warper.set_reference_mesh(reference.getVTKMesh(), staticPoints); + ASSERT_TRUE(warper.get_warp_available()); + + Mesh output = warper.build_mesh(movingPoints); + ASSERT_TRUE(output.numPoints() > 0); + ASSERT_TRUE(output.numFaces() > 0); + + // Verify no NaN values in output + Eigen::MatrixXd points = output.points(); + for (int i = 0; i < points.rows(); i++) { + ASSERT_FALSE(std::isnan(points(i, 0))); + ASSERT_FALSE(std::isnan(points(i, 1))); + ASSERT_FALSE(std::isnan(points(i, 2))); + } +} + +TEST(MeshTests, laplacianWarpSelfWarp) { + // Self-warp: warping with same particles should produce mesh close to reference + Mesh reference(std::string(TEST_DATA_DIR) + "/ellipsoid_0.ply"); + + std::string staticPath = std::string(TEST_DATA_DIR) + "/ellipsoid_0.particles"; + std::vector paths = {staticPath, staticPath}; + ParticleSystemEvaluation particlesystem(paths); + Eigen::MatrixXd allPts = particlesystem.get_matrix(); + Eigen::MatrixXd staticPoints = allPts.col(0); + + int numParticles = staticPoints.rows() / 3; + staticPoints.resize(3, numParticles); + staticPoints.transposeInPlace(); + + MeshWarper warper; + warper.set_warp_method(WarpMethod::Laplacian); + warper.set_reference_mesh(reference.getVTKMesh(), staticPoints); + ASSERT_TRUE(warper.get_warp_available()); + + // Self-warp: use same particles as reference + Mesh output = warper.build_mesh(staticPoints); + ASSERT_TRUE(output.numPoints() > 0); + + // Vertex count should match + ASSERT_EQ(output.numPoints(), warper.get_num_warp_vertices()); +} + +TEST(MeshTests, warpMethodBenchmark) { + // Benchmark: run both methods on the same data and print timing comparison + std::string ref_mesh = "/mesh_warp/mesh_warp2.vtk"; + std::string ref_particles = "/mesh_warp/mesh_warp2.particles"; + + Mesh reference(std::string(TEST_DATA_DIR) + ref_mesh); + + std::string staticPath = std::string(TEST_DATA_DIR) + ref_particles; + std::vector paths = {staticPath, staticPath}; + ParticleSystemEvaluation particlesystem(paths); + Eigen::MatrixXd allPts = particlesystem.get_matrix(); + Eigen::MatrixXd staticPoints = allPts.col(0); + int numParticles = staticPoints.rows() / 3; + staticPoints.resize(3, numParticles); + staticPoints.transposeInPlace(); + + const int num_warps = 10; + + // -- Laplacian -- + { + MeshWarper warper; + warper.set_warp_method(WarpMethod::Laplacian); + warper.set_reference_mesh(reference.getVTKMesh(), staticPoints); + + auto t0 = std::chrono::high_resolution_clock::now(); + warper.generate_warp(); + auto t1 = std::chrono::high_resolution_clock::now(); + double precompute_ms = std::chrono::duration(t1 - t0).count(); + + auto t2 = std::chrono::high_resolution_clock::now(); + for (int i = 0; i < num_warps; i++) { + warper.build_mesh(staticPoints); + } + auto t3 = std::chrono::high_resolution_clock::now(); + double warp_ms = std::chrono::duration(t3 - t2).count(); + + std::cout << "\n=== Warp Method Benchmark ===" << std::endl; + std::cout << "Laplacian: precompute=" << precompute_ms << "ms" + << " warp=" << warp_ms / num_warps << "ms/shape" + << " (" << num_warps << " warps)" << std::endl; + } + + // -- Biharmonic -- + { + MeshWarper warper; + warper.set_warp_method(WarpMethod::Biharmonic); + warper.set_reference_mesh(reference.getVTKMesh(), staticPoints); + + auto t0 = std::chrono::high_resolution_clock::now(); + warper.generate_warp(); + auto t1 = std::chrono::high_resolution_clock::now(); + double precompute_ms = std::chrono::duration(t1 - t0).count(); + + auto t2 = std::chrono::high_resolution_clock::now(); + for (int i = 0; i < num_warps; i++) { + warper.build_mesh(staticPoints); + } + auto t3 = std::chrono::high_resolution_clock::now(); + double warp_ms = std::chrono::duration(t3 - t2).count(); + + std::cout << "Biharmonic: precompute=" << precompute_ms << "ms" + << " warp=" << warp_ms / num_warps << "ms/shape" + << " (" << num_warps << " warps)" << std::endl; + std::cout << "==============================\n" << std::endl; + } +} + +TEST(MeshTests, laplacianWarpMethodSwitch) { + // Verify that warp method can be set and queried + MeshWarper warper; + ASSERT_EQ(warper.get_warp_method(), WarpMethod::Biharmonic); // default + + warper.set_warp_method(WarpMethod::Biharmonic); + ASSERT_EQ(warper.get_warp_method(), WarpMethod::Biharmonic); + + warper.set_warp_method(WarpMethod::Laplacian); + ASSERT_EQ(warper.get_warp_method(), WarpMethod::Laplacian); +} + TEST(MeshTests, findReferenceMeshTest) { std::vector meshes; meshes.push_back(Mesh(std::string(TEST_DATA_DIR) + "/m03_L_femur.ply")); diff --git a/docs/studio/images/surface_reconstruction_biharmonic.jpg b/docs/studio/images/surface_reconstruction_biharmonic.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5e840b0a2682f69609aa857b57f6045fc83721c8 GIT binary patch literal 31920 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 z%0A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НbrcxUIh-Eb_E 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 AP5=M^ literal 0 HcmV?d00001 diff --git a/docs/studio/studio-analyze.md b/docs/studio/studio-analyze.md index 5540aa29ab..66727a7d22 100644 --- a/docs/studio/studio-analyze.md +++ b/docs/studio/studio-analyze.md @@ -101,19 +101,7 @@ See [Shape Model Evaluation](../new/ssm-eval.md) for more information about shap ## Surface Reconstruction Panel -The surface reconstruction panel provides options for the surface reconstruction method. There are three surface reconstruction methods available depending on the data you supply. - -`Legacy` - If an older XML file with only particle files is supplied, then only this option is available. This is the fallback option since it requires only the particles. - -`Mesh Warping Based` - Mesh warping based method that utilizes the mean mesh. You must have either meshes supplied or image based (distance transforms). - -`Distance Transform Based` - Surface reconstruction based on distance transforms. Project must have distance transforms. - -![ShapeWorks Studio Analysis Surface Reconstruction Panel](../img/studio/studio_analyze_surface_reconstruction.png) - -Below is an example of the difference in using this option. - -![ShapeWorks Studio Surface Reconstruction Result](../img/studio/studio_analyze_surface_reconstruction_result.png) +See the [Surface Reconstruction](surface-reconstruction.md) page for details on reconstruction methods, warp method options, and examples. ## Good/Bad Particles Panel ## diff --git a/docs/studio/surface-reconstruction.md b/docs/studio/surface-reconstruction.md new file mode 100644 index 0000000000..501479e064 --- /dev/null +++ b/docs/studio/surface-reconstruction.md @@ -0,0 +1,81 @@ +# Surface Reconstruction + +ShapeWorks reconstructs dense surface meshes from sparse correspondence particles. Since correspondence particles are placed sparsely across the surface, a dense mesh must be generated for visualization and downstream analysis. ShapeWorks does this by deforming a reference (template) mesh to match each shape's particle positions. + +## Reconstruction Methods + +Three surface reconstruction methods are available in the Analysis module, depending on your data: + +| Method | Requirements | Description | +|--------|-------------|-------------| +| **Mesh Warping** | Meshes or distance transforms | Deforms a template mesh using correspondence particles as control points. Recommended for most workflows. | +| **Distance Transform** | Distance transforms | Reconstructs surfaces from distance transforms. Requires groomed distance transforms in the project. | +| **Legacy** | Particles only | Fallback method for older XML projects that only contain particle files. | + +The reconstruction method can be selected from the radio buttons in the Surface Reconstruction panel. + +![ShapeWorks Studio Analysis Surface Reconstruction Panel](../img/studio/studio_analyze_surface_reconstruction.png) + +Below is an example of the difference between reconstruction methods. + +![ShapeWorks Studio Surface Reconstruction Result](../img/studio/studio_analyze_surface_reconstruction_result.png) + +## Mesh Warping + +Mesh warping is the default and recommended reconstruction method. It works by: + +1. Selecting a **template shape** (typically the median) from the population. +2. **Embedding** the template's correspondence particles as vertices in its mesh (splitting triangles as needed). +3. **Deforming** the enriched template mesh so that the embedded particle vertices move to each target shape's particle positions, dragging the rest of the mesh along smoothly. + +This produces a dense mesh for every shape in the population that shares the same connectivity (triangle topology), which is useful for computing point-to-point correspondences across the full surface. + +### Template Selection + +The template shape serves as the reference mesh that gets deformed to reconstruct all other shapes. You can choose the template using the options in the Mesh Warp panel: + +- **Median** -- Automatically selects the shape closest to the population median. This is the default and generally works well. +- **Template Sample** -- Manually select a specific shape index to use as the template. + +After changing the template or warp method, click **Run Mesh Warp** to regenerate the reconstructions. + +![Mesh Warp Options Panel](images/surface_reconstruction_panel.png){: width="400" } + +### Warp Methods + +Two warp methods are available for deforming the template mesh. The method can be selected from the **Warp Method** dropdown in the Mesh Warp options. The warp method is saved per project. The default for new projects can be changed in **Edit > Preferences** under the Mesh Optimization section. + +#### Biharmonic (Default) + +Biharmonic deformation computes a weight matrix that expresses every mesh vertex as a weighted combination of the particle positions. Once computed, each per-shape warp is a single matrix multiplication. This is the default and works well for most cases. + +#### Laplacian + +Laplacian surface deformation preserves the local curvature of the reference mesh during warping. Vertices far from any particle maintain their original surface shape, which can reduce artificial thinning in regions with sparse particle coverage. + +Both methods use [libigl](https://libigl.github.io/) for the underlying geometry processing (biharmonic weights and cotangent Laplacian respectively). + +**Laplacian** may produce better results when particles are unevenly distributed or on thin structures. **Biharmonic** is a good default for most datasets. + +| Biharmonic | Laplacian | +|:---:|:---:| +| ![Biharmonic](images/surface_reconstruction_biharmonic.jpg) | ![Laplacian](images/surface_reconstruction_laplacian.jpg) | + +### Python API + +The warp method can also be set programmatically using the Python API: + +```python +import shapeworks + +warper = shapeworks.MeshWarper() + +# Set warp method (default is Biharmonic) +warper.setWarpMethod(shapeworks.WarpMethod.Laplacian) +# or +warper.setWarpMethod(shapeworks.WarpMethod.Biharmonic) + +# Set up and run warping +warper.generateWarp(reference_mesh, reference_particles) +warped_mesh = warper.buildMesh(target_particles) +``` diff --git a/mkdocs.yml b/mkdocs.yml index 5e6a702c02..e6bd100b20 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -46,6 +46,7 @@ nav: - 'Groom Module': 'studio/studio-groom.md' - 'Optimize Module': 'studio/studio-optimize.md' - 'Analyze Module': 'studio/studio-analyze.md' + - 'Surface Reconstruction': 'studio/surface-reconstruction.md' - 'DeepSSM Module': 'studio/deepssm-in-studio.md' - 'Multiple Domains SSM': 'studio/multiple-domains.md' - 'Shared Boundaries': 'studio/studio-shared-boundary.md'