matlab从图表中提取数据
?
有如下的波形圖,如何從中精確提取出全部的數據:
1,將波形圖片(截圖)保存為test.png或test.jpg,并將圖片放于matlab工作目錄中,如下圖示例所指定的目錄中:
2,新建文件,輸入如下程序代碼,將文件保存為jpg2data.m(名字可以隨便取):
代碼:
% 提取圖片中的曲線數據
clear,clc,close all
%% 圖片與曲線間的定標
im=imread('test.jpg');%讀入圖片(替換成需要提取曲線的圖片)
im=rgb2gray(im);%灰度變化
thresh = graythresh(im);%二值化閾值
im=im2bw(im,thresh);%二值化
set(0,'defaultfigurecolor','w')
imshow(im)%顯示圖片
[y,x]=find(im==0);%找出圖形中的“黑點”的坐標。該坐標是一維數據。
y=max(y)-y;%將屏幕坐標轉換為右手系笛卡爾坐標
y=fliplr(y);%fliplr()——左右翻轉數組
plot(x,y,'r.','Markersize', 2);
disp('請在Figrure中先后點擊實際坐標框的兩個頂點(左上點和右下點),即A、B兩點. ');
[Xx,Yy]=ginput(2);%Xx,Yy——指實際坐標框的兩個頂點
min_x=input('最小的x值');%輸入x軸最小值,已知圖片,可直接賦確定值如min_x=-30;
max_x=input('最大的x值');%輸入x軸最大值,可直接賦確定值如max_x=130;
min_y=input('最小的y值');%輸入y軸最小值,可直接賦確定值如min_y=-2;
max_y=input('最大的y值');%輸入y軸最大值,可直接賦確定值如max_y=5;
?
x=(x-Xx(1))*(max_x-min_x)/(Xx(2)-Xx(1))+min_x;
y=(y-Yy(2))*(min_y-max_y)/(Yy(1)-Yy(2))+max_y;
plot(x,y,'r.','Markersize', 2);
axis([min_x,max_x,min_y,max_y])%根據輸入設置坐標范圍
title('由原圖片得到的未處理散點圖')
%% 將散點轉換為可用的曲線
%需處理的問題與解決思路
%(1)散點圖中可能一個x對應好幾個y <---> 保留mean()-std()到mean()+std()之間的y值 并取平均處理
%(2)曲線的最前端和最后段干擾較大 <---> 去掉曲線整體的前(如5%)和后5%
%(3)曲線的最頂端和最底段干擾較大 <---> 去掉曲線整體的上10%和下10%
?
%參數預設
rate_x=0.08;%曲線的最前端和最后段刪除比例
rate_y=0.05;%曲線的最頂端和最底段刪除比例
?
[x_uni,index_x_uni]=unique(x);%找出有多少個不同的x坐標
?
x_uni(1:floor(length(x_uni)*rate_x))=[];%除去前rate_x(如5%)的x坐標
x_uni(floor(length(x_uni)*(1-rate_x)):end)=[];%除去后rate_x的x坐標
index_x_uni(1:floor(length(index_x_uni)*rate_x))=[];%除去前rate_x的x坐標
index_x_uni(floor(length(index_x_uni)*(1-rate_x)):end)=[];%除去后rate_x的x坐標
?
[mxu,a]=size(x_uni);
[mx,b]=size(x);
for ii=1:mxu
if ii==mxu
ytemp=y(index_x_uni(ii):mx);
else
ytemp=y(index_x_uni(ii):index_x_uni(ii+1));
end
%刪除方差過大的異常點
threshold1=mean(ytemp)-std(ytemp);
threshold2=mean(ytemp)+std(ytemp);
ytemp(find(ytemp<threshold1))=[];%刪除同一個x對應的一段y中的異常點
ytemp(find(ytemp>threshold2))=[];
%刪除距頂端和底端較近的點
thresholdy=(max_y-min_y)*rate_y;%y坐標向閾值
ytemp(find(ytemp>max_y-thresholdy))=[];%刪除y軸向距離頂端與底端距離小于rate_y的坐標
ytemp(find(ytemp<min_y+thresholdy))=[];
%剩下的y求均值
y_uni(ii)=mean(ytemp);
end
%此時很多x_uni點處對應的y_uni為空,即NAN,要進一步刪去這些空點
x_uni(find(isnan(y_uni)))=[];
y_uni(find(isnan(y_uni)))=[];
%畫圖
?
% figure,plot(x_uni,y_uni),title('經處理后得到的掃描曲線')
axis([min_x,max_x,min_y,max_y])%根據輸入設置坐標范圍
% 將最終提取到的x與y數據保存
curve_val(1,:)=x_uni';
curve_val(2,:)=y_uni;
?
%% 對提取出的數據進行擬合(按實際情況進行修改)
[p,s]=polyfit(curve_val(1,:),curve_val(2,:),4);%多項式擬合(為避免龍格庫塔,多項式擬合階數不宜太高)
[y_fit,DELTA]=polyval(p,x_uni,s);%求擬合后多項式在x_uni對應的y_fit值
?
hold on
% figure,
plot(x_uni,y_fit),title('擬合后的曲線')
axis([min_x,max_x,min_y,max_y])%根據輸入設置坐標范圍
?
% 輸出數據到EXCEL
delete('test.xlsx');
data = [ x_uni y_fit ];
[m n]=size(data);
data_cell=mat2cell(data,ones(m,1),ones(n,1));%matrix轉變成cell
title={'溫度差','電壓mV'};%添加變量名稱,x軸,y軸變量名
result=[title;data_cell];%歸納變量名稱和數據
S = xlswrite( 'test1.xls',result,'Sheet1' ); %保存數據到excel
?
保存文,運行(F5):
輸入x最大最小值及y最大最小值:
到此就成功用matlab從圖片中精確提取出數據!!
?
微信關注圖中張十三的博客公眾號,學習更多技術干貨:
?
?
總結
以上是生活随笔為你收集整理的matlab从图表中提取数据的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: excel 多项式拟合数据
- 下一篇: 玩转Mixly – 2、Arduino