I pushed a little function box_height_field.m
to gptoolbox. This function creates a height field from an image where each pixel becomes an extruded square (rather than just a point/vertex). There are two modes, one that's fast, vectorized version which doesn't add vertices so that the mesh is closed (though the underlying surface will still be "water-tight"). And a slower version which really creates a perfectly closed height field. Heres' the result of the second one on the red-channel of the Hans Hass image:
im = im2double(imresize(rgb2gray(imread('hans-hass.jpg')),0.1));
[V,F] = box_height_field(im);
Here's the same result but computed after quantizing the colors:
im = round(im/0.25)*0.25;
[V,F] = box_height_field(im);
You can clearly see the piecewise-constant regions. Using remesh_planar_patches
you can reduce the number of version with losing any information:
[W,G] = remesh_planar_patches(V,F);