赞
踩
前段时间老师让我把这张图片里的数据采出来,然后做一些数据处理。
小Z寻思这不是一张图片吗,里面的数据要采出来岂不是要用尺子量半天?这样做的误差非常大,所以我想利用图像处理做一个非常简单的程序来采集图中曲线的坐标数据。
利用简单图像处理和x-y绘制散点图实现重构图片坐标轴,基本步骤为:截图保存图片-读取图片-转为灰度图-滤除非曲线像素区域(-清除异常点)-画图。
首先截取一张图,并保存下来,截图要求与坐标区基本保持一致,如下图。
代码如下:
close all;clear all;clc; % matlab一键三连
I=imread('C:\Users\1.png'); % 读取图片
Ig=rgb2gray(I); % 图片转灰度图
figure,imshow(Ig); % 显示图片
[row,col]=size(Ig); % 读取图片行和列的像素个数
代码如下:
Ig(Ig>=90)=255; % 令图片中大于90的数据为255
figure,imshow(Ig); % 显示图片
这里阈值的作用是区分图中曲线和非曲线的区域,因为曲线是一条黑色线,整体数值接近0,而非曲线的坐标趋于为白色,数值接近255。
由于曲线并非完全接近0,而我们的目标是将干扰点和白色的坐标区域基本去掉即可,所以这里采用暴力阈值分割的方法。
阈值的选取可以通过查阅灰度图矩阵的数值,然后人为选取。
代码如下:
x=zeros(1,row*col); % 创建一行以目标图片总像素个数为长度的x矩阵 y=zeros(1,row*col); % 创建一行以目标图片总像素个数为长度的y矩阵 xl=0.2; % x轴尺度 yl=2.2; % y轴尺度 for i=1:row for j=1:col if Ig(i,j)~=255 x(i*j)=j/col*xl; % 归一化并取x轴尺度 y(i*j)=yl-(i/row*yl); % 归一化并取y轴尺度 end end end figure,plot(x,y,'.'); % 画散点图 xlim([0,0.2]); % 设置x范围 ylim([0,2.2]); % 设置y范围 set(gca,'XTick',[0:0.1:0.2],'YTick',[0:0.2:2.2]); grid on
注意这里for循环采集数据的顺序是逆y轴、顺x轴的方向进行的,所以x矩阵和y矩阵的处理方式略有不同。
坐标轴尺度请根据实际情况设置。
有时候截图出来的坐标轴颜色和曲线颜色非常接近,导致重构的矩阵会把坐标轴或者坐标轴的一些点也画出来,甚至会出现x矩阵和y矩阵长度不一致的报错,所以需要进行一些简单的边界处理。
代码如下:
% 以下两行代码作用为清除坐标轴线,如有需要请插入第二步和第三步的代码之中
% Ig((row-4:row),:)=255;
% Ig(:,1:4)=255;
x(y==0)=[];
y(x==0)=[];
x(x==0)=[];
y(y==0)=[];
处理结果如下图
误差分析:本方法误差完全来自第一步的截图和图像的失真程度。
由于图中一个x对应多个y值,所以绘制出来的是散点图,与原图略有差别,如果追求与原图完全一致,则需要加入连线数据,这样做比较复杂,这里不再讨论。本方法非常容易,用于数据处理也完全足够。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。