File Exchange

image thumbnail

Im2mesh (2D image to triangular meshes)

version 1.76 (121 KB) by Jiexian Ma
Convert 2d multi-phase image to FEM meshes, with poly-line simplification feature.


Updated 16 Dec 2020

View Version History

View License

This tool consists of a few functions, like, im2Bounds (image to polygonal boundaries), getCtrlPnts (mark intersecting vertex between polygons, serving as fixed point for polygon simplification and meshing), simplifyBounds (simplify polygon), poly2mesh (polygon to triangular meshes, printInp (export as Inp file), and printBdf (export as Bdf file).

- Exactly reserve the contact detail between different phases.
- Able to avoid sharp corners when simplifying polyline.
- Support phase selection before meshing (see demo7.m)
- Generated mesh can be exported as inp file (Abaqus), bdf file (Nastran bulk data), and .node/.ele file.
- 7 examples are presented in demo1.m ~ demo7.m.

Note: To make this code run (especially for poly2mesh), you need to download MESH2D from, and add the folder (mesh2d-master) to your path. After that, you can start with demo1.m~demo7.m in im2mesh. Check the images in the folder (im2mesh\images\...).

If you have any questions or suggestions, feel free to send me an email., Nov 2020.

Great thanks Dr. Yang Lu providing valuable advice on this tool.  

Cite As

Jiexian Ma (2021). Im2mesh (2D image to triangular meshes) (, MATLAB Central File Exchange. Retrieved .

Comments and Ratings (17)

Brandon Caasenbrood

Beautiful! Exactly what i needed!

Jiexian Ma

@家铭 崔: I haven't got chances to test it on R2020a. You could paste the error message from R2020a up here.
It should be fine with R2019b.

家铭 崔

I have a little question: is this program suitable for Matlab R2019b? I encounter a problem when adding Image Processing Toolbox which marked with R2020a.

Jiexian Ma

@Daniel: Hi Daniel. Suppose your original 8-bit image is imO. You could use following code to convert imO to segmented image im.
im = imO;
im( im<=30 ) = 1;
im( im>30 & im<=100 ) = 2;
im( im>100 ) = 3;

Daniel Offenbacker

This is a really great code! Works wonderfully.

@Jiexian Can you help me slightly modify the code? I'm attempting to model a sophisticated aggregate structure and it results in several hundreds of parts generated for ABAQUS. Do you have any idea of how to modify the code so I can group certain colors into one part? For example, all gray scale pixels between 0 and 30 are considered air and all between 30 and 100 are considered aggregate?

Thanks and thanks so much for putting together this tool!


Hello, I have tried to add the folder mesh2d-master to the path but I cannot find any such folder anywhere. Can anyone help with this?


Jiexian Ma

@chunfeng hi chunfeng, you can send me an email with your images.


Hello, I especially want to know how the demo pictures are processed. When I use your algorithm to process my pictures, both the accuracy and efficiency are not satisfactory, I hope to get your guidance,Thank you

Mohammad Imtiaz

Excellent very useful. Is it possible to export files in Triangle (Shewchuk) format? .node, .ele, .edge. If so can this include boundary, node and element attributes?

Jiexian Ma

@chunfeng: Yes, that's the purpose of this tool. However, for large images (>1000*1000), it takes some time to get the meshing result. Check the latest version. I add some examples. About boundary conditions, check the comments that I wrote in printInp_multiPart.m. Boundary node numbers of each material is extracted. Node set and node-based surface at boundary of each material are defined in the exported inp file. Since the node-based surface is not supported in Abaqus CAE, you might need to read the documentation of Abaqus about how to use inp file to define boundary conditions and constraints.


Hello, I want to know if this method can accurately define the mesh of boundary intersection of different materials to make the boundary smoother. In addition, does the number and node generated by this method satisfy the finite element calculation? The boundary node numbers of different materials can be extracted separately and used to impose boundary conditions in the finite element?


@Jiexian: Got it! This is helpful - thanks. FYI: I have tweaked it to just select which specific gray levels we want to mesh (and which to ignore).

Nice work and helpful code. Thanks!

Jiexian Ma

@Seth, yep, I know your meaning.
You can replace line 19 to 21 in im2Bounds.m with following code. It should work.
nlevels = 1;
bounds = cell( 1, nlevels );
intensity = max(max(im));


Is there a simple way to provide the mesh of just a single object in the image instead of meshing the full image space? For example, you provide an example image titled "a1.tif". Is it easy to just mesh the white object instead of both the white and black space? (Say I wanted to build a solid model in Abaqus of this white object, but the black color is just air and is not usually modeled).

This may also be helpful in the cases of very large images that require a long time to mesh. In that case, I don't want to waste resources on meshing the background of the image.

Many thanks!

Yang Frank Lu

I tried the code by running the "demo.m" file. There is an Abaqus input file, "test.inp", generated. However, when I import the inp file to ABAQUS CAE or Hypermesh, both of them complain about errors. Would you please double check the formatting of the inp file?

MATLAB Release Compatibility
Created with R2018a
Compatible with any release
Platform Compatibility
Windows macOS Linux

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!