|
FigureGet今天發(fā)布一款新的科研工具
為了寫成這個軟件(的雛形),圖圖在過去的幾周里嘗試了各種算法(與參數(shù))的組合,其中目前的版本主要包括濾波算法和霍夫檢測。如果你恰好比較了解這方面的內(nèi)容,那么應該可以下載代碼進行靈活的改進;如果你是小白也沒關系,后續(xù)會在B站“圖通道”發(fā)布詳細的原理和代碼編寫介紹(視頻)。回顧Grabit在正式展示 '利用MATLAB提取實驗數(shù)據(jù)點' ![]() 聰明的小伙伴會發(fā)現(xiàn)與本期內(nèi)容相比少了自動兩個字。 在第一個視頻里介紹了一個小程序grabit,它能夠基于標定好的坐標尺,根據(jù)手動采集的點生成實驗數(shù)據(jù)。雖然是英文界面,但是操作步驟簡單,邏輯也很清晰,但總感覺少了點什么——圖圖在采點的時候手會抖,而且也無法均勻的采點;最要命的時候當波形復雜時候幾乎是不可能采集到真實數(shù)據(jù)...避免“手采”便成了當務之急。
當然grabit也有其適用場景,比如計算機視覺技術無法識別的時候,人眼+grabit的結(jié)合能幫你采集到需要的數(shù)據(jù)。 grabit鏈接及下載:https://www.bilibili.com/video/BV155411Y7J5FigureGet運行原理下面我以下方這張圖(百度圖片隨便截取的)為例介紹一下主要的操作邏輯,暫時的GUI界面一共只有五個(組)按鈕,非常簡單。 ![]() ![]() 1 加載點擊右上角按鈕
下方的操作無嚴格順序,但建議俺演示的順序進行。 2 標定在右上角面板中輸入圖片坐標軸的極值,這個值將作為最終曲線實際數(shù)據(jù)計算的依據(jù),如果標定錯誤并不會影響曲線的形狀,但是會影響比例,因此盡量準確! ![]() 3 切割切割時會標定四個點,它們依次決定Xmin,Xmax,Ymin,Ymax對應的像素位置,也就是說,切割后形成的圖像中的點與2中標定好的坐標區(qū)的中的點一一對應!為了避免混淆,2&3中的點請全部選擇坐標框的角點位置。 ![]() 4 直線檢測這一步是針對具有網(wǎng)格線的坐標軸自動去除網(wǎng)格線,主要用到的就是霍夫變換了,有一些Hough參數(shù)沒有寫在GUI中,在deleteLine.m代碼里可以調(diào)整: ![]()
對于網(wǎng)格線比較清晰的圖,效果還是很好的。 ![]() 5 橡皮擦橡皮擦就是一個簡單的圖像處理方法了,主要用于清理圖片上的多余內(nèi)容,為下一步的曲線提取做準備。 ![]() 橡皮擦的大小由像素控制,因為暫時沒有做撤回功能,請從小到大選用,GUI左上角會給出整個圖片的像素值作為相對參考。 ![]() 在橡皮擦這一步完成全部的幾何清理,尤其要保證邊界的干凈與整潔;有限的間斷點并沒有關系。 ![]() 6 識別最后一步識別的會依次采用: ·邊緣檢測(二值化的一種方法)·降低采樣頻率·濾波·(擬合) 來盡可能的還原原始圖像,或者逼近原始圖像但是濾掉細節(jié),在界面中設置了兩個主要參數(shù)以供可視化的調(diào)節(jié),其它內(nèi)容可以在simpleLine.m代碼中進行調(diào)節(jié)。 ![]() simpleLine.m的部分內(nèi)容 % 二值化圖像% ———————————————————————————————————————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,結(jié)果NaNx(isnan(y)) = [];y(isnan(y)) = [];plot(x,y,'y','LineWidth',1)hold off% 坐標轉(zhuǎn)換% ———————————————————————————————————————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 結(jié)果最終會得到提取好的數(shù)據(jù)結(jié)果,XY坐標數(shù)據(jù)會同步導出到工作區(qū),你可以后續(xù)單獨二次加工。 ![]() ![]() 通過提取參數(shù)的不同可以得到不同形式的曲線 ![]() 這是我們最后得到的曲線 ![]() 以上的內(nèi)容展示了整個的工作流程,涉及到的操作有點多,也并沒有展開講每一部分的原理,大家拿到代碼后可以先運行并且讀一下各個部分的代碼,而后進行深度定制。這個軟件目前肯定有其不足之處與適用場景,除了提取數(shù)據(jù)之外,更希望大家能從源碼與流程中掌握一些圖像/數(shù)據(jù)處理的方式。 后續(xù)會在B站更新一遍詳細的視頻操作流程,并詳細介紹每個模塊是如何編寫的。 |
|
|