有时候仅能找到一副图片,希望获取图片里的曲线数据。
本实验思路:
核心思想:以像素点作为曲线的数据点。
具体实现:采用matlab处理图片,并二值化后提取曲线坐标,以平均值作为同一个横坐标上相邻的纵坐标数据。
1.如某pdf文档截图得到的图片:
某模块datasheet截图
2.用绘图软件删除无用的标记,并将图片零点移动到图片的左下角,切割图片使图片仅仅包含坐标网格的范围。如下:
删除掉无用数据并移动零点后(d1.png)
3.用matlab处理图片,并获取数据。
源码如下:
clear all;
clc;
%%
B=imread('Z:\d1.png');
ax= [0 60 0 2];
%整个图片的数据范围
%%
C=im2bw(B);
%图像二值化
[m n]=find(C==0);
%搜寻曲线的矩阵坐标
NM=[n m];
D=NM;
S=size(C);
%获取图片像素大小
for i=1:max(n)
[x
y]=find(NM(:,1)==i);
D(x,2)=mean(NM(x,2));
%平均值合并同一个横坐标上的纵坐标数据
end
%%
IM=[D(:,1) S(1)-D(:,2)];
plot(IM(:,1),IM(:,2));
Imx=(IM(:,1)/S(2))*(ax(2)-ax(1))+ax(1);
Imy=(IM(:,2)/S(1))*(ax(4)-ax(3))+ax(3);
%归一化图片坐标,并计算实际坐标值
plot(Imx,Imy,'x-');
grid on;
%%
Imm=[Imx,Imy];
%获取到的数据~~~
4.结果如下:
matlab的plot
总结:在整个操作过程中,对图片的处理花费了较长时间,特别是由于坐标网格的原因使清除无用格点较难精确,多擦或少擦了部分,致使数据计算存在偏差。。。
再思考下有没有什么好策略,可以直接处理,不用或尽量简化图片的预处理~~~~
p.s.对下面这种图还是可行的,框选下删删就成了。。。
来源于网络