FigureGet今天发布一款新的科研工具 ![]() 回顾Grabit在正式展示 '利用MATLAB提取实验数据点' ![]() 聪明的小伙伴会发现与本期内容相比少了自动两个字。 在第一个视频里介绍了一个小程序grabit,它能够基于标定好的坐标尺,根据手动采集的点生成实验数据。虽然是英文界面,但是操作步骤简单,逻辑也很清晰,但总感觉少了点什么——图图在采点的时候手会抖,而且也无法均匀的采点;最要命的时候当波形复杂时候几乎是不可能采集到真实数据...避免“手采”便成了当务之急。 当然grabit也有其适用场景,比如计算机视觉技术无法识别的时候,人眼+grabit的结合能帮你采集到需要的数据。 grabit链接及下载:https://www.bilibili.com/video/BV155411Y7J5 FigureGet运行原理下面我以下方这张图(百度图片随便截取的)为例介绍一下主要的操作逻辑,暂时的GUI界面一共只有五个(组)按钮,非常简单。 ![]() ![]() 1 加载点击右上角按钮
下方的操作无严格顺序,但建议俺演示的顺序进行。 2 标定在右上角面板中输入图片坐标轴的极值,这个值将作为最终曲线实际数据计算的依据,如果标定错误并不会影响曲线的形状,但是会影响比例,因此尽量准确! ![]() 3 切割切割时会标定四个点,它们依次决定Xmin,Xmax,Ymin,Ymax对应的像素位置,也就是说,切割后形成的图像中的点与2中标定好的坐标区的中的点一一对应!为了避免混淆,2&3中的点请全部选择坐标框的角点位置。 ![]() 4 直线检测这一步是针对具有网格线的坐标轴自动去除网格线,主要用到的就是霍夫变换了,有一些Hough参数没有写在GUI中,在deleteLine.m代码里可以调整: ![]()
对于网格线比较清晰的图,效果还是很好的。 ![]()
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 on hold on H = 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,结果NaN x(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站更新一遍详细的视频操作流程,并详细介绍每个模块是如何编写的。 |
|