分享

一键自动提取实验曲线数据 | FigureGet

 汉无为 2022-03-30

图片

FigureGet

今天发布一款新的科研工具FigureGet,用于 自动 提取实验数据点;

图片

图片为了写成这个软件(的雏形),图图在过去的几周里尝试了各种算法(与参数)的组合,其中目前的版本主要包括滤波算法和霍夫检测。如果你恰好比较了解这方面的内容,那么应该可以下载代码进行灵活的改进;如果你是小白也没关系,后续会在B站“图通道”发布详细的原理和代码编写介绍(视频)。

回顾Grabit

在正式展示FigureGet之前,先来看看图通道的第一个视频:

'利用MATLAB提取实验数据点'

图片

聪明的小伙伴会发现与本期内容相比少了自动两个字。

在第一个视频里介绍了一个小程序grabit,它能够基于标定好的坐标尺,根据手动采集的点生成实验数据。虽然是英文界面,但是操作步骤简单,逻辑也很清晰,但总感觉少了点什么——图图在采点的时候手会抖,而且也无法均匀的采点;最要命的时候当波形复杂时候几乎是不可能采集到真实数据...避免“手采”便成了当务之急。

图片

当然grabit也有其适用场景,比如计算机视觉技术无法识别的时候,人眼+grabit的结合能帮你采集到需要的数据。

grabit链接及下载:https://www.bilibili.com/video/BV155411Y7J5

FigureGet运行原理

下面我以下方这张图(百度图片随便截取的)为例介绍一下主要的操作逻辑,暂时的GUI界面一共只有五个(组)按钮,非常简单。

图片
图片
FG 1.0

1 加载

点击右上角按钮加载需要处理的图片。

关于图片做一下简单说明:当前的版本并非基于线条的颜色进行数据提取,所以颜色是不重要的,如果你有多根颜色不一样的线条,建议先采用PhotoShop的魔棒工具提取出单根曲线,或者自行编写代码提取也无妨,这个部分并不复杂,因此没有纳入到软件代码中。总之,尽量采用图像软件将不必要的细节去除,保留目标曲线。


下方的操作无严格顺序,但建议俺演示的顺序进行。

2 标定

在右上角面板中输入图片坐标轴的极值,这个值将作为最终曲线实际数据计算的依据,如果标定错误并不会影响曲线的形状,但是会影响比例,因此尽量准确!

图片

3 切割

切割时会标定四个点,它们依次决定Xmin,Xmax,Ymin,Ymax对应的像素位置,也就是说,切割后形成的图像中的点与2中标定好的坐标区的中的点一一对应!为了避免混淆,2&3中的点请全部选择坐标框的角点位置。

图片

4 直线检测

这一步是针对具有网格线的坐标轴自动去除网格线,主要用到的就是霍夫变换了,有一些Hough参数没有写在GUI中,在deleteLine.m代码里可以调整:

图片

写在界面的参数(直线检测对应的参数,右上角)用于控制删除直线的范围!

对于网格线比较清晰的图,效果还是很好的。

图片
霍夫变换原理:https://www.bilibili.com/video/BV1xo4y1X7mz

5 橡皮擦

橡皮擦就是一个简单的图像处理方法了,主要用于清理图片上的多余内容,为下一步的曲线提取做准备。

图片

橡皮擦的大小由像素控制,因为暂时没有做撤回功能,请从小到大选用,GUI左上角会给出整个图片的像素值作为相对参考。

图片

在橡皮擦这一步完成全部的几何清理,尤其要保证边界的干净与整洁;有限的间断点并没有关系。

图片

6 识别

最后一步识别的会依次采用:

·边缘检测(二值化的一种方法)·降低采样频率·滤波·(拟合)

来尽可能的还原原始图像,或者逼近原始图像但是滤掉细节,在界面中设置了两个主要参数以供可视化的调节,其它内容可以在simpleLine.m代码中进行调节。

图片
边缘检测-降采样-滤波-...

simpleLine.m的部分内容

% 二值化图像% ———————————————————————————————————————subplot(222)thresh = 0.9; %将thresh以下的像素都变成黑色!BW = im2bw(RGB,thresh); BW = 1-edge(rgb2gray(RGB),'canny',0.5);imshow(BW)ax = gca;axis onhold onH = size(BW,2);V = size(BW,1);index = linspace(1,V,V)';flag = repmat(index,1,H).*(1-BW); % 计算黑色像素点的坐标x = 1:H;y = sum(flag,1)./(V-sum(BW,1)); % 分母有可能为0,结果NaNx(isnan(y)) = [];y(isnan(y)) = [];plot(x,y,'y','LineWidth',1)hold off% 坐标转换% ———————————————————————————————————————subplot(223)z = ax.YLim(2)-y+ax.YLim(1);h = plot(x,z,'k','LineWidth',1);hold off% 滤波与重采样% ———————————————————————————————————————subplot(224)z = ax.YLim(2)-y+ax.YLim(1);h = plot(x,z,'k:','LineWidth',1);hold on% 等距降采样index = int32(linspace(1,length(x),fix(length(x)/step)));x = x(index);z = z(index);% 滤波作用z_filted = smoothdata(z,'gaussian',windowSize);z_filted(1) = z(1); % 第一点不滤波z_filted(end) = z(end); % 最后一点不滤波

7 结果

最终会得到提取好的数据结果,XY坐标数据会同步导出到工作区,你可以后续单独二次加工。

图片
图片

通过提取参数的不同可以得到不同形式的曲线

图片

这是我们最后得到的曲线

图片

以上的内容展示了整个的工作流程,涉及到的操作有点多,也并没有展开讲每一部分的原理,大家拿到代码后可以先运行并且读一下各个部分的代码,而后进行深度定制。这个软件目前肯定有其不足之处与适用场景,除了提取数据之外,更希望大家能从源码与流程中掌握一些图像/数据处理的方式。

后续会在B站更新一遍详细的视频操作流程,并详细介绍每个模块是如何编写的。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多