是有带图的结果输入数据?

15的观点(30天)

答案(2)

为副总经理
为副总经理 2021年7月10日
编辑:为副总经理 2021年9月23日
编辑:我知道这是一个死亡的问题,但是我用这个作为一个参考答案的地方。
我已经发布了类似的答案 之前 ,每次我必须指出,任何提取信息的质量会有问题的。您正在使用的狼狈地压缩低分辨率表示的数据提供足够的模棱两可,某些细节只是不可恢复的(如粗线模糊,使用相同的颜色为多个重叠的曲线)。从一个非常贫穷的信息来源和希望自动提取数据没有人类的努力只是一种单调乏味的监督。换句话说,你要么努力投资抄录数据,或者你必须投资至少尽可能多的精力在照顾一个非常脆弱的自动化是一样的。
以下三种方法来恢复数据,从最坏的和最好的结局。可能会有比这三个例子更好或更糟,但这是我展示什么。
1:直接的光栅图像分析
让我们尝试直接从图像中提取的曲线。自从红色曲线是模糊的和黑色曲线是最模糊的,我会用蓝色曲线。
inpict = imread (“crank.jpg”);
%试图提取蓝色的痕迹
mb = inpict (:: 1) < 100 & inpict (:,: 2) < 100 & inpict (:,:, 3) > 50;
lpict = bwmorph (mb,“薄”,100);
[x] y =找到(lpict);
imshow (mb)
%的数据范围从图
xrange = [0 1000];
yrange = (-200 - 400);
%的过程,一个很宽的边缘过滤器
%为每个轴只选择最大的对象
w = 100;
颗= repmat ([1], [w 1])。/ w;
inpict = rgb2gray (inpict) < 128;
一个= bwareafilt (imfilter (inpict颗),2);
b = bwareafilt (imfilter (inpict颗。”),2);
%得到图框区段
S = regionprops (,“重心”);
C = vertcat (S.Centroid);
xl = C (: 1);
S = regionprops (b),“重心”);
C = vertcat (S.Centroid);
yl = C (:, 2);
%重新调节以适应数据范围
x = xrange (1) + diff xrange () * (x-xl (1))。/ diff (xl);
y = yrange (2) - diff (yrange) * (y-yl (1))。/ diff(黄);
%因为这是蓝色的曲线,转移180 d
x = x - 180;
%摆脱nonunique点;光滑的
[x, idx ~] =独特的(x);
y = y (idx);
xn =光滑(x);
yn =光滑(y);
情节(xn, yn);网格
xlim xrange ()
ylim (yrange)
粗笨的和不完美的,因为这是,它甚至通常不会解决这一点。剩下的曲线,就抵消了由90度曲线。如果有任何有意义的差异痕迹,早就失去了这些信息。同样,这样的图片是不准确的数据源。他们只是粗略的可视化数据。
2:手动转录与光栅SVG图像分析
这两个方法是我以前推荐。矢量图像编辑器中打开图片(我使用Inkscape),覆盖一个矩形图框,手动使用贝塞尔工具适合曲线通过将光滑节点在每个转折点。选择矩形和曲线,导出为png。现在至少有一半的问题已被消灭。压缩工件,图框,标签,网格线,和重叠的废话都消失了。它只是一个薄曲线。图像的几何本身直接对应到图框区段。
就像在之前的例子中,减少边缘和点的分类可以让我们表示数据。
%减少曲线,找到点
lpict = rgb2gray (imread (“cranktrace1.png”));
lpict = bwmorph (lpict > 128年,“薄”,100);
[x] y =找到(lpict);
%的数据范围从图
xrange = [0 1000];
yrange = (-200 - 400);
%重新调节以适应数据范围
x = xrange (1) + diff (xrange) * x /尺寸(lpict 2);
y = yrange (2) - diff (yrange) * y /尺寸(lpict, 1);
%摆脱nonunique点;光滑的
[x, idx ~] =独特的(x);
y = y (idx);
xn =光滑(x);
yn =光滑(y);
情节(xn, yn);网格
xlim xrange ()
ylim (yrange)
我附加了svg文件(zip归档文件,因为该网站不知道什么是svg文件),和光栅输出曲线1。
3:人工转录SVG SVG直接进口
方法2只是一个增量改进方法1。它利用你做出明智的决定的能力目标的形状可能模棱两可的线在周围的噪音,但它扔掉很多潜在的转换回一个光栅图像。没有内置的SVG导入工具,我假设我不得不写一个路径处理的能力,但显然我没看到,已经有一个FEX:
这简化了一切。方法2,手工抄写图像使用矢量图像编辑器。感兴趣的对象是一个矩形对应图框,和路径对象对应于情节痕迹。现在,SVG文件本身可以进口显著降低错误(转录本身一样好。
% manually-fit svg文件的文件名
帧=“cranktrace.svg”;
%数据从原始图像轴标签
xrange = [0 1000];
yrange = (-200 - 400);
%样条离散化参数[0 1]
粗糙= 0.001;
%得到几何图框
str = fileread(帧);
str = regexp (str,'((? < = <矩形)(. * ?)(? = \ / >))”,“匹配”);
pbx = regexp (str,' ((? < = x = ") (. * ?) (? = ")),“匹配”);
pby = regexp (str,' ((? < = y = ") (. * ?) (? = ")),“匹配”);
pbw = regexp (str,'((? < =宽度= ")(. * ?)(? = ")),“匹配”);
pbh = regexp (str,'((? < =身高= ")(. * ?)(? = ")),“匹配”);
pbrect = [str2double (pbx {1} {1}) str2double (pby {1} {1})
str2double (pbw {1} {1}) str2double (pbh {1} {1})];
%得到曲线坐标表示
S = loadsvg(帧、粗糙、假);
x = S {1} (: 1);%假设第一路径是正确的
S y = {1} (:, 2);
%如果有多个路径你想提取
%你需要做重新调节,为每个元素等的年代
%重新调节以适应数据范围
x = xrange (1) + diff xrange () * (x-pbrect (1)) / pbrect (3);
y = yrange (1) + diff (yrange) * (pbrect (4) - (y-pbrect (2))) / pbrect (4);
%摆脱nonunique点
[x, idx ~] =独特的(x);
y = y (idx);
%的阴谋
情节(x, y);网格;持有
xlim xrange ()
ylim (yrange)
结论
通过覆盖这些三个例子相同的情节(放大),我们可以看到大量的抖动造成的两条曲线来自关键的光栅图像。红色的痕迹(方法1)最严重的是由于分割缺陷,但洋红色痕迹(方法2)仍然相当接近方法3提供的光滑曲线。
尤其是对光滑曲线,直接转录和SVG进口产生平滑结果尽可能准确的用户困扰抄写的形象。易感性问题引起的压缩、注释、网格线,重叠的曲线、线型、线宽、或紧尖点是最小化。依赖于直接、自动化分析原油和重压缩光栅图像是极其有限的。
这些例子仅仅是例子,没有健壮的和普遍适用的代码。光栅方法尤其有可能需要调整使用与其他图像。

胡安·纳瓦罗
胡安·纳瓦罗 2021年7月10日
看到这个:
//www.tianjin-qmedu.com/matlabcentral/answers/383567-how-to-extract-x-y-data-values-from-matlab-figure
1评论
为副总经理
为副总经理 2021年7月10日
编辑:为副总经理 2021年7月10日
值得注意的是,这个工作如果图本身是可用的。如果图窗口是打开或保存为.fig文件,绘制数据嵌入,可以准确提取。虽然这将是可取的,但它不是一个选项,如果只复制光栅图像。OP应该澄清……

登录置评。

s manbetx 845


释放

R2014a

社区寻宝

找到宝藏在MATLAB中央,发现社区如何帮助你!

开始狩猎!