How to fill surface with interpolated values?
Show older comments
Hi,
I'm working on a mesh, resulting from an stl file . I extracted the mesh with gridtrimesh.m
This is the mesh plotted over the stl object:

As you cas see, there are some holes (for instance, the one in the red rectangle).
How can I fill the holes?
I tried with interp2, but it seems that it can't "go" beyond the surface borders.
Do you have any suggestion?
Thank you in advance for any replies.
Accepted Answer
More Answers (1)
the cyclist
on 19 Jun 2022
Edited: the cyclist
on 19 Jun 2022
1 vote
Your code does not seem to have a call to interp2, so I'm not sure what might have gone wrong there.
If you did not specify an extrapolation method explicitly, then the implicit method that MATLAB uses may have filled in NaN, depending on the interpolation method. For example, linear interpolation will fill NaN in the extrapolation region, if you do not specify the extrapolation method.
8 Comments
Giuseppe Parisi
on 20 Jun 2022
Giuseppe Parisi
on 20 Jun 2022
the cyclist
on 20 Jun 2022
I couldn't get your code to run. I put all the files you uploaded in a directory (including the file you uploaded to google instead of here). Then I ran the code you pasted above that "obtains the mesh". I get the error:
Error using patch
Value must be a 1x2 or 1x3 vector of numeric type.
Error in answerTest (line 22) % <--------- This is my own file, where I put your code, so may not correspond to your line numbering
l=patch('vertices',V','faces',F,'edgecolor','none', 'facecolor',[0.8 0.8 0.8],'facelighting','gouraud');
This does not seem to be related to your actual question, so I'm not sure what the issue is.
That being said, your interpolation
Zq = interp2(X,Y,Z,Xq,Yq, 'cubic', 0);
will not do any extrapolation outside the range of points you have. The cubic method will fill in NaN unless you specify the extrapolation method, as described in the documentation for interp2.
Giuseppe Parisi
on 20 Jun 2022
the cyclist
on 20 Jun 2022
Fixed that, and now I get this error:
Error using struct
Conversion to struct from double is not possible.
Error in answerTest (line 34)% <--- Again, you'll have a different line number
Xq(i)=struct(i).Position(1); %query point coordinates X
When you say you want a method "outside the range of the mesh points", which operation are you talking about? Do you mean the interpolation (which I have already explained what to try), the patch command, or something else?
Giuseppe Parisi
on 20 Jun 2022
the cyclist
on 21 Jun 2022
I have a hypothesis about what is going on here, but I'm not certain.
It seems from your image that the colored mesh is only covering the top surface of the gray image, and not "curling" under, to cover the parts of the face that curve underneath.
You can see that nearer the jaw, the mesh lines drop straight down to the next surface, but do not capture that inward-curving part of the surface. (I am imagining the color as if it were all dropped straight down like rain, rather than a net that would grip all sides of the face.)
This makes sense to me, because meshgrid will only yield one value of Z for each (X,Y) pair.
[Maybe you realized all this already.]
I don't have enough experience to suggest a way to fix this. @Image Analyst's idea of using scatteredInterpolant seems like a good one, though.
Image Analyst
on 21 Jun 2022
scatteredInterpolant will only get you the top surface. It will not curl under and give you the bottom surface. However, if that's okay, you can use it but you should find those spurious spikes and filter them out so you just have valid data.
Categories
Find more on Lighting, Transparency, and Shading in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!
