利用图像识别技术进行全自动非结构化网格划分

今天给大家分享一个很有意思的划分网格工具:可以根据图像进行非结构化划分网格

代码来源https://github.com/otvam/mesh_from_bitmap_matlab

若Github访问速度较慢,也可以在公众号后台回复:图像识别划分网格,便可自动获取压缩包。

示例效果

先看看一些效果图吧:

利用图像识别技术进行全自动非结构化网格划分的图1
利用图像识别技术进行全自动非结构化网格划分的图2
利用图像识别技术进行全自动非结构化网格划分的图3
利用图像识别技术进行全自动非结构化网格划分的图4
利用图像识别技术进行全自动非结构化网格划分的图5
利用图像识别技术进行全自动非结构化网格划分的图6
利用图像识别技术进行全自动非结构化网格划分的图7
利用图像识别技术进行全自动非结构化网格划分的图8

代码介绍

主函数文件

用户可通过调节结构体里面的参数进行图像的拾取及单元尺寸的控制,需要注意有以下几点:

  • 在进行选择图像时,只能选择黑、白两种颜色的图像,即黑色区域为划分网格的区域;
  • 图像通过 imread函数进行读取,支持 bmppngjpg格式;
  • h_minh_max分别控制单元的最小尺寸与最大尺寸;
  • h_growth表示单元尺寸的增长率,具体含义我解释不清楚,反正,h_growth越大,网格越稀疏,h_growth越小,网格越密集;
  • scalesimplify_tol也是控制网格局部加密的函数,会根据内外轮廓进行适当局部加密。scale越大网格越密集,simplify_tol越小越密集,用户可自己慢慢调节,知道调整至自己想要的效果,具体含义还需自己多玩玩。
%% data_img
% scale 越大越密集
% simplify_tol 越小越密集
img_data = struct(...
    'img', imread('model.bmp'),...
    'scale'0.6,...
    'simplify_tol',0.1,...
    'h_growth'1.2,...
    'h_min'0.1,...
    'h_max'20.0...
    );

%% run
mesh = get_mesh(img_data);
%% plot
fig = figure()
set(fig,'Color','white')
pdemesh(mesh)
axis('tight')
axis('off')
end

getmesh函数

function mesh = get_mesh(img_data)
% extract
img = img_data.img;
scale = img_data.scale;
simplify_tol = img_data.simplify_tol;
h_growth = img_data.h_growth;
h_min = img_data.h_min;
h_max = img_data.h_max;

% transform the image into binary
img = rgb2gray(img);
img = imbinarize(img);
img = img==false;

% rotate coordinate
img = fliplr(img.');

% get the contours of the image
c_cell = contour_create(img, scale);
c_cell = contour_simplify(c_cell, simplify_tol);

% create the 2d triangulation
mesh = triangulation_create(c_cell, h_growth, h_min, h_max);

导入Abaqus

既然木木长期玩转Abaqus,那肯定是要导入到Abaqus中滴!

需要在原有数据结构中做一些改变,并输出至txt文件中,方便inp引用,具体代码如下:

clear;
mesh = run_example();
Node = mesh.Nodes;
Node = Node';
Element = mesh.Elements;
Element = Element';

elementIDs = (1:size(Element, 1))';
elementDataWithIDs = [elementIDs, Element];


nodeIDs = (1:size(Node, 1))';
nodeDataWithIDs = [nodeIDs, Node];


fileName = 'Element.txt';
dlmwrite(fileName, elementDataWithIDs, 'delimiter'',');

fileName = 'Node.txt';
dlmwrite(fileName, nodeDataWithIDs, 'delimiter'',');

inp文件做如下修改,节点、单元数据修改为:*include,input = .\Node.txt*include,input = .\Element.txt,记得将文本文件放在Abaqus工作目录下。

*Node
*include,input = .\Node.txt
*Element, type=CPS3
*include,input = .\Element.txt

然后就可以导入进Abaqus,进行有限元的一些操作了,效果如下:

利用图像识别技术进行全自动非结构化网格划分的图9

令我感到惊奇的是,我怕生成的网格看上去好看,质量有的不太行,于是我又进行了网格质量检查,发现0警告,0错误!!!,只能说:牛批!!!

利用图像识别技术进行全自动非结构化网格划分的图10

运行了两个案例,效果如下,供大家娱乐~

利用图像识别技术进行全自动非结构化网格划分的图11
利用图像识别技术进行全自动非结构化网格划分的图12



利用图像识别技术进行全自动非结构化网格划分的图13

默认 最新
当前暂无评论,小编等你评论哦!
点赞 评论 收藏 4
关注