首页/文章/ 详情

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

1年前浏览3527



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

示例效果

先看看一些效果图吧:

 
 
 
 
 
 

代码介绍

主函数文件

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

  • 在进行选择图像时,只能选择黑、白两种颜色的图像,即黑色 区域为划分网格的区域;
  • 图像通过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,进行有限元的一些操作了,效果如下:

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

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


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



来源:易木木响叮当
Abaqus控制
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2023-10-27
最近编辑:1年前
易木木响叮当
硕士 有限元爱好者
获赞 224粉丝 283文章 355课程 2
点赞
收藏
未登录
还没有评论
课程
培训
服务
行家
VIP会员 学习计划 福利任务
下载APP
联系我们
帮助与反馈