DEMO_surface_smooth_methods
Below is a demonstration for:
- The use of patchSmooth to smooth surface using either the Laplacian or Humphreys classes method
Contents
clear; close all; clc;
fontSize=15; cMap=gjet(250);
C=gjet(4);
c1=C(4,:);
c2=C(2,:);
[F,V]=stanford_bunny; %Some graphics data
V_noisy=V+5*randn(size(V));
V1=V_noisy;
V2=V_noisy;
nSteps=15;
nSub=1;
Comparing smoothening methods
hf=cFigure; subplot(1,2,1); hold on; ht1=title('Laplacian smoothing','FontSize',fontSize); gpatch(F,V,0.5*ones(1,3),'none',0.2); hp1=gpatch(F,V1,c1,'k',1); axisGeom(gca,fontSize); axis manual; axis off; camlight right; zoom(1.5); subplot(1,2,2); hold on; ht2=title('Humphreys classes smoothing','FontSize',fontSize); gpatch(F,V,0.5*ones(1,3),'none',0.2); hp2=gpatch(F,V2,c2,'k',1); axisGeom(gca,fontSize); axis manual; axis off; camlight right; zoom(1.5); drawnow;
animStruct.Time=linspace(0,1,nSteps); animStruct.Handles{1}=[hp1,hp2,ht1,ht2]; %Handles of objects to animate animStruct.Props{1}={'Vertices','Vertices','String','String'}; %Properties of objects to animate animStruct.Set{1}={V1,V2,'Laplacian smoothing i=0','Humphreys classes smoothing i=0'}; %Property values for to set in order to animate clear cPar; cPar1.n=nSub; %Number of iterations cPar1.Method='LAP'; %Smooth method cPar2.n=nSub; %Number of iterations cPar2.Method='HC'; %Smooth method for q=2:1:nSteps [V1]=patchSmooth(F,V1,[],cPar1); [V2]=patchSmooth(F,V2,[],cPar2); %Set entries in animation structure animStruct.Handles{q}=[hp1,hp2,ht1,ht2]; %Handles of objects to animate animStruct.Props{q}={'Vertices','Vertices','String','String'}; %Properties of objects to animate animStruct.Set{q}={V1,V2,['Laplacian smoothing i=',num2str(q*nSub)],['Humphreys classes smoothing i=',num2str(q*nSub)]}; %Property values for to set in order to animate end anim8(hf,animStruct); hf=cFigure; subplot(1,2,1); hold on; ht1=title('Laplacian smoothing','FontSize',fontSize); gpatch(F,V,0.5*ones(1,3),'none',0.2); hp1=gpatch(F,V1,c1,'k',1); axisGeom(gca,fontSize); axis manual; axis off; camlight right; zoom(1.5); subplot(1,2,2); hold on; ht2=title('Humphreys classes smoothing','FontSize',fontSize); gpatch(F,V,0.5*ones(1,3),'none',0.2); hp2=gpatch(F,V2,c2,'k',1); axisGeom(gca,fontSize); axis manual; axis off; camlight right; zoom(1.5); drawnow;
Comparing using color
clear hf animStruct; V1=V_noisy; V2=V_noisy; C1=minDist(V1,V); C2=minDist(V2,V); hf=cFigure; subplot(1,2,1); hold on; ht1=title('Laplacian smoothing','FontSize',fontSize); gpatch(F,V,0.5*ones(1,3),'none',0.2); hp1=gpatch(F,V1,C1,'k',1); axisGeom(gca,fontSize); axis manual; axis off; camlight right; zoom(1.5); colormap(cMap); caxis manual; caxis([0 max(C1(:))]); hc=caxis; colorbar; subplot(1,2,2); hold on; ht2=title('Humphreys classes smoothing','FontSize',fontSize); gpatch(F,V,0.5*ones(1,3),'none',0.2); hp2=gpatch(F,V2,C2,'k',1); axisGeom(gca,fontSize); axis manual; axis off; camlight right; zoom(1.5); colormap(cMap); caxis(hc); colorbar; drawnow;
animStruct.Time=linspace(0,1,nSteps); animStruct.Handles{1}=[hp1,hp2,ht1,ht2,hp1,hp2]; %Handles of objects to animate animStruct.Props{1}={'Vertices','Vertices','String','String','CData','CData'}; %Properties of objects to animate animStruct.Set{1}={V1,V2,'Laplacian smoothing i=0','Humphreys classes smoothing i=0',C1,C2}; %Property values for to set in order to animate clear cPar; cPar1.n=nSub; %Number of iterations cPar1.Method='LAP'; %Smooth method cPar2.n=nSub; %Number of iterations cPar2.Method='HC'; %Smooth method for q=2:1:nSteps [V1]=patchSmooth(F,V1,[],cPar1); [V2]=patchSmooth(F,V2,[],cPar2); C1=minDist(V1,V); C2=minDist(V2,V); %Set entries in animation structure animStruct.Handles{q}=[hp1,hp2,ht1,ht2,hp1,hp2]; %Handles of objects to animate animStruct.Props{q}={'Vertices','Vertices','String','String','CData','CData'}; %Properties of objects to animate animStruct.Set{q}={V1,V2,['Laplacian smoothing i=',num2str(q*nSub)],['Humphreys classes smoothing i=',num2str(q*nSub)],C1,C2}; %Property values for to set in order to animate end anim8(hf,animStruct);
GIBBON www.gibboncode.org
Kevin Mattheus Moerman, [email protected]
GIBBON footer text
License: https://github.com/gibbonCode/GIBBON/blob/master/LICENSE
GIBBON: The Geometry and Image-based Bioengineering add-On. A toolbox for image segmentation, image-based modeling, meshing, and finite element analysis.
Copyright (C) 2019 Kevin Mattheus Moerman
This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/.