我怎么能把一个svg文件在Matlab矩阵或图像?
17日视图(30天)
显示旧的评论
我有一个svg文件包含模型的切片。我如何在Matlab导入和读片吗?二片,我需要遍历每个人获得相应的矩阵。我宁愿不使用交换功能,但这并不是强制性的。
3评论
接受的答案
为副总经理
2022年11月4日
如果你有光栅图像嵌入SVG文件,您可以提取它们是这样的:
% svg文件的文件名
帧=“multiobject.svg.fakeextension.txt”;
%提取图像扩展和数据文件
%忽略文件中的所有其他对象
str = fileread(帧);
blockinfo = regexp (str,的数据:图像/ (. * ?);base64, ((^”) *),“令牌”);
为k = 1:元素个数(blockinfo)
%得到这张图片的信息
thisext = blockinfo {k} {1};
条= blockinfo {k} {2};
%解码图像文件
条= matlab.net.base64decode(条);
%编写使用原始的文件格式扩展
帧= sprintf (“myextractedfile_ % 04 d % s”k thisext);
fid = fopen(帧,' w ');
写入文件(大型木钉条,“uint8”);
文件关闭(fid);
结束
现在所有的文件可以被从磁盘读取。
一个= imread (“myextractedfile_0001.png”);
imshow (A)
![](http://www.tatmou.com/matlabcentral/answers/uploaded_files/1180393/image.png)
不知道到底是什么文件,我不知道这是你需要的。
13个评论
西蒙白色短衣Ramusino
2022年11月4日
不可能直接把这里的svg文件。我离开这里一个示例截图:在我的文件(这是一个Slic3r输出)我有93片,都堆在一个svg
您的代码在这里没有工作,不幸的是。
谢谢你的支持金宝app
为副总经理
2022年11月4日
编辑:为副总经理
2022年11月4日
形状的一个屏幕快照不告诉我任何关于什么
实际上在文件中
。虽然我给个建议阅读嵌入光栅图像,我有怀疑的对象文件中嵌入的光栅图像。我不知道为什么一个切片机将渲染输出栅格数据在SVG容器中。我期望的输出向量。如果是这样的话,那么上面的代码不能工作。因为我不知道错误发生,我没有别的可以继续。
有可能他们是光栅图像,但是我浅熟悉格式约定可能意味着文本处理不会对SVG文件由应用程序生成的其他工作比我使用。这可能是一个容易解决,但我讨厌继续猜。
编辑:我说我讨厌继续猜测,但这里有一个猜想:
blockinfo = regexp (str,的数据:图像/ (. * ?);\ s * base64 \ s * ((^”) *),“令牌”);
如果事实证明对象是向量数据,这可能是一个小的挑战在MATLAB得到它转换。可能会有其他的选择。我还不知道。
如果你可以用你现有的方法来生成一个
简化
版本的文件或文件的一个版本使用非机密信息,然后你可以上传。真的不需要超过一个或两片。编辑器不会让你直接附加一个svg文件,但是你可以闭嘴或者做我所做的,把一个假的扩展。
西蒙白色短衣Ramusino
2022年11月4日
我明白了。谢谢你的努力。输出来自软件Slic3r,据我所见,它应该产生矢量对象,正如你所说。
代码根本不会产生一个错误,只是blockinfo细胞保持空的。
或者,我们可以解决这个问题:上游有办法卷Matlab(即一个3 d矩阵)从一个stl文件吗?因为这是我的目标。stl和我可以阅读它在Matlab和脸和顶点(或三角结构),但从这些我需要创建几何的“片”,这是一个一系列的矩阵。我已经尝试填补()来获得某种2 d屏幕的一部分,就像从上面看,但是它并没有说服我
![](http://www.tatmou.com/matlabcentral/answers/uploaded_files/1181223/image.png)
我得到这个,这个我可以继续得到一个矩阵表示;但它不会工作,如果几何变化沿z轴。
这是我寻找一个切片软件的原因,如果我们能避免这种情况,在Matlab做一切,这就太好了
西蒙白色短衣Ramusino
2022年11月4日
我刚刚发现函数VOXELISE交流,对我来说,可能是对的,但我不能清楚地看到如何使用它。你有没有使用它呢?
是的,获取二进制矩阵/体积将是完美的;抗锯齿可能是一个问题。
为副总经理
2022年11月5日
编辑:为副总经理
2022年11月5日
啊,好。
是很值得重视的,这就是我了。
% svg文件的文件名
帧=“Type_IV.svg”;
%的图像缩放
规模= 20;% px /毫米(我假设这些单位是毫米)
%提取图像扩展和数据文件
%忽略文件中的所有其他对象
str = fileread(帧);
%得到页面几何
%的例子:< svg宽度= " 114.999998 "高=“19”
页大小= regexp (str,' < svg宽度= " (\ d + \ ? \ d *)“高度=”(\ d + \ ? \ d *)”的,“令牌”);
页大小= fliplr (str2double (pagesize {1}));% (x, y)
%得到z-height每个多边形
%我目前假设这些都是按顺序排列的
%的例子:< g id = " layer0 " slic3r: z = " 1.35 e - 008 " >
zpos = regexp (str,' < g id =“层\ d +”slic3r: z =”(\ d + \ ? \ d * (eE + -) * \ d *)“>”,“令牌”);
zpos = str2double (vertcat (zpos {:}));
nframes =元素个数(zpos);
%得到每个多边形点列表
%的例子:<多边形slic3r: type = "轮廓"点=“……”
pointdata = regexp (str,' <多边形slic3r: type = "轮廓"点= " ([^]*)”,“令牌”);
为c = 1: nframes
thisblock = pointdata {c} {:};
thisblock = strrep (thisblock,”、“,' ');
thisblock = str2num (thisblock);% #好< ST2NM >
pointdata {c} =重塑(thisblock 2 [])”;% (x, y)
结束
%建立图像栈使用ROI的工具
%这是严格1页/片,所以z-geometry目前忽略!
outpict = false([装天花板*页大小(规模)nframes]);
imshow (outpict (:: 1))
投资回报率= images.roi.Polygon (gca);
为c = 1: nframes
ROI。位置=规模* pointdata {c};
outpict (:,:, c) = createMask (ROI);
结束
%假设z-steps是统一的,阁楼z重新调节
%这不会真正帮助在这种情况下,由于部分太薄
%如果x和y z股票一样的分辨率,它可以减少到一个页面
%厚=规模*范围(zpos);
% outpict =逻辑(imresize3(单(outpict),(装天花板(规模*页大小)厚),“最近”));
volshow (outpict)
![](http://www.tatmou.com/matlabcentral/answers/uploaded_files/1181778/image.png)
以上将生成一个二进制图像体积。鉴于,z-resolution并不受人尊敬;它只是一个页面每层(比在现实中厚)。在这种情况下,使有效分辨率[20 20 1 / (2.7 e-08)] px /毫米(假设x, y,和z都在毫米),鉴于z-step e-08是2.7。
注释代码将做放样,但我认为最好可能代表这些东西的z-scale独立的x, y的规模。
西蒙白色短衣Ramusino
2022年11月5日
这个绝对可以工作,事实上我接受这个答案!
但是我必须承认我不能理解代码的每个部分,有功能我不熟悉(比如你如何使用正则表达式?和你如何获取svg属性?)。如果你能添加一些评论,显然没有义务,我将很感激。
决议:我不认为我需要放样;我知道最终的总体尺寸和体素尺寸我想outpict的体积:
体积大小=(224、2717、93)像素
,或者
立体像素尺寸= 0.08 0.04 0.027毫米
我怎么能实施这些呢?
为副总经理
2022年11月6日
你应该能够用一个文本编辑器中打开一个SVG文件看看。如您所见,有时不同的软件写东西,天真的解析器(就像我写的)不会期望。注意这一事实slic3r使用自己的标签。
就像我说的,我的解析尝试是很天真的。严格根据手头的文件,我回忆的其他文件,而不是深入了解格式规范和最佳实践的健壮的解码。我使用正则表达式来匹配的事情所以让这个例子不适用的其他软件生成的文件。
我扩大了表情。我不是伟大的正则表达式,但这是一个开始。
% svg文件的文件名
帧=“Type_IV.svg”;
%输出图像大小
巨大的= (224 - 2717);% (x, y)
%读取整个文件
str = fileread(帧);
%得到页面几何
%的例子:< svg宽度= " 114.999998 "高=“19”
%()的部分提取的令牌
% (\ d + \ ? \ d *)
% \ d +一个或多个数字
% \。零个或一个文字。字符
% \ d *任何数字的零个或多个
页大小= regexp (str,' < svg宽度= " (\ d + \ ? \ d *)“高度=”(\ d + \ ? \ d *)”的,“令牌”);
页大小= fliplr (str2double (pagesize {1}));% (x, y)
规模= outsize. /页大小;%计算产出规模大小
%得到z-height每个多边形
%我目前假设这些都是按顺序排列的
%的例子:< g id = " layer0 " slic3r: z = " 1.35 e - 008 " >
% (\ d + \ ? \ d * (eE + -) * \ d *)
% \ d +一个或多个数字
% \。零个或一个文字。字符
% \ d *任何数字的零个或多个
% (eE + -) *括号内的零个或多个字符
% \ d *任何数字的零个或多个
zpos = regexp (str,' < g id =“层\ d +”slic3r: z =”(\ d + \ ? \ d * (eE + -) * \ d *)“>”,“令牌”);
zpos = str2double (vertcat (zpos {:}));
nframes =元素个数(zpos);
%得到每个多边形点列表
%的例子:<多边形slic3r: type = "轮廓"点=“……”
% ([^]*)
%[^ "]*零个或多个字符不”
pointdata = regexp (str,' <多边形slic3r: type = "轮廓"点= " ([^]*)”,“令牌”);
为c = 1: nframes
thisblock = pointdata {c} {:};
thisblock = strrep (thisblock,”、“,' ');
thisblock = str2num (thisblock);% #好< ST2NM >
pointdata {c} =重塑(thisblock 2 [])”;% (x, y)
结束
%建立图像栈使用ROI的工具
%这是严格1页/片,所以z-geometry目前忽略!
outpict = false([装天花板(规模。*页大小)nframes]);
imshow (outpict (:: 1))%显示一页设置轴几何
投资回报率= images.roi.Polygon (gca);%创建一个多边形ROI对象在当前轴
为c = 1: nframes
ROI。位置= fliplr(规模)。* pointdata {c};%设置多边形的顶点列表
outpict (:,:, c) = createMask (ROI);%将多边形转换成二维二进制图像
结束
我重新安排了天平的使用参数。在本例中,您指定输出几何,而不是规模。结果应该224 x2717x93。
西蒙白色短衣Ramusino
2022年11月6日
如果我得到这个权利,你“简单”创建了一个物质上的语法识别和读取这个svg文件的标记;即使它不能多用途,应该总是为这些工作slic3r . svg文件创建?
然后你定义页面几何和“阴谋”所需的形状。我将永远有一个损失的信息,像一个别名效应,对吧?这是由于试图定义cruved行像素,我想. .即使我尝试:
投资回报率= image.roi.FreeHand (gca);
没有什么变化。
最后一个真正的疑问:为什么你定义
规模
数组?我的意思是,在42岁行不能写这个:
outpict = false([装天花板(特大号)nframes]);
在接下来的循环:
为c = 1: nframes
ROI。位置= fliplr (outsize. /页大小)。* pointdata {c};%设置多边形的顶点列表
outpict (:,:, c) = createMask (ROI);%将多边形转换成二维二进制图像
结束
的
巨大的
数组是不固定的,我总是知道如何填补它,
规模看起来
不必要的. .还是我误解什么?
为副总经理
2022年11月6日
是的,我基本上看了看文件,认为相同的软件生成的其他文件会有相同的格式。除非slic3r发生在添加一些多边形对象以外的一些文件,我初步认为它应该工作。这是一个近似基于一个观察。
与images.roi.Freehand交换images.roi.Polygon()()并没有真正改变什么,因为他们的属性是compatibly-oriented位置。两者之间唯一的区别是它们如何这样做时创建交互式地(用鼠标)。因为它们使用编程方式,他们的行为是一样的。
是的,我想你可以重写它。我刚看见知道潜在价值的因素之间的映射部分几何和图像几何。,有点前遗留的代码。你有空去适应它但是你感觉适合你的需要。
西蒙白色短衣Ramusino
2022年11月6日
好吧,不管怎样,我可以适应它如果svg文件发生了变化,固定的正则表达式语法。
我明白了,确实没有什么变化,“混叠”仍然存在,但我认为这是不可避免的。
是的,最后我想我会让它不变,所以我可以使用比例因子,如果必要的。
非常感谢你,你是晶莹剔透,帮了我很多。我很抱歉我不是非常精确。
再次感谢
更多的答案(0)
一个错误发生
无法完成的行动,因为页面所做的更改。重新加载页面更新状态。
你也可以从下面的列表中选择一个网站
表现最好的网站怎么走吗
选择中国网站(中文或英文)最佳站点的性能。其他MathWorks国家网站不优化的访问你的位置。