%程序初始化
clear all;
%定义图像处理所需的参数容限
Tol_RGBscale=30/255; %输入RGB颜色容差(范围0~1)
Tol_LineW=5; %输入线宽容差
%定义真实坐标轴
Lx_real=12000; %输入X轴真实坐标长度;
Ly_real=0.8; %输入Y轴真实坐标长度;
x0_real=0; %输入X轴真实起始坐标;
y0_real=0; %输入Y轴真实起始坐标;
img_1=imread('Pic_demo.jpg'); %读取需要提取数据的图片
img_1=im2double(img_1);
imshow(img_1,'InitialMagnification',200); %显示读取的图片,并设置显示比例
%提取坐标轴
disp('选取坐标图的4顶点...');
[x_ax,y_ax] = ginput(4); %使用ginput函数实现坐标轴4端点(左下、左上、右下、右上)的图上坐标提取,在图窗上依次点击4端点以完成提取
x_ax=sort(x_ax); %使用sort函数对提取的4个x坐标进行排序,从而区分x轴的起点与x轴的终点,前两个数据为x轴的起点,后两个数据为x轴的终点
y_ax=sort(y_ax); %同上
x0_pic=round(mean(x_ax(1:2))); %计算图像中的X轴起点;
x1_pic=round(mean(x_ax(3:4))); %计算图像中的X轴终点;
Lx_pic=x1_pic-x0_pic; %计算图像中的X轴长度;
y0_pic=round(mean(y_ax(1:2))); %计算图像中的Y轴起点;
y1_pic=round(mean(y_ax(3:4))); %计算图像中的Y轴终点;
Ly_pic=y1_pic-y0_pic; %计算图像中的Y轴长度;
%消除左侧坐标轴突起的干扰
disp('为消除左侧坐标轴突出标识的干扰,选择左侧坐标轴突出标识区的4顶点...');
[x_Lax,y_Lax]=ginput(4);
x_Lax=sort(x_Lax);
y_Lax=sort(y_Lax);
x0_L=round(mean(x_Lax(1:2)));
x1_L=round(mean(x_Lax(3:4)));
y0_L=round(mean(y_Lax(1:2)));
y1_L=round(mean(y_Lax(3:4)));
img_1(y0_L:y1_L,x0_L:x1_L,:)=1;
imshow(img_1,'InitialMagnification',200);
%提取数据
%提取目标曲线的RGB三色基准参考值
disp('在目标曲线上选取5个点,获得目标曲线的基准灰度值...');
[x_cr,y_cr]=ginput(5); %提取曲线上5个点,作为基准灰度参考值;
RGB_cr=zeros(5,3); %获取上述五点的灰度值;
for i=1:5
RGB_cr(i,:)=img_1(round(y_cr(i)),round(x_cr(i)),:);
end
RGB_mean=zeros(1,3);
RGB_std=zeros(1,3);
for i=1:3
RGB_mean(i)=mean(RGB_cr(:,i)); %计算上述五点的灰度平均值;
RGB_std(i)=std(RGB_cr(:,i)); %计算上述五点的灰度标准差;
end
RGB_rf=zeros(1,3); %初始化参考灰度值;取标准差以内的灰度值计算平均数获得参考灰度值;
for j=1:3
k=1;
for i=1:5
if abs(RGB_cr(i,j)-RGB_mean(j))<=RGB_std(j)
RGB_rf(j)=(RGB_rf(j)*(k-1)+RGB_cr(i,j))/k;
k=k+1;
end
end
end
%在图片坐标轴区域内寻找RGB相近的点并记录
[num_l,num_w,num_d]=size(img_1);
img_2=zeros(num_l,num_w);
for i=1:num_l
for j=1:num_w
if (abs(img_1(i,j,1)-RGB_rf(1))<=Tol_RGBscale) && (abs(img_1(i,j,2)-RGB_rf(2))<=Tol_RGBscale) && (abs(img_1(i,j,3)-RGB_rf(3))<=Tol_RGBscale)
img_2(i,j)=1;
end
end
end
[yc_pic,xc_pic]=find(img_2(y0_pic:y1_pic,x0_pic:x1_pic,1)==1);
%对find()函数获得的点进行筛选合并;
x_curve=zeros(1,Lx_pic);
y_curve=zeros(1,Lx_pic);
count1=1;
for i=2:length(xc_pic)
if (i==2) || (xc_pic(i)~=xc_pic(i-1)) %将x(i)相等的点的y(i)值置于同一数组内
x_temp=xc_pic(i);
y_temp=yc_pic(i);
for j=i+1:length(xc_pic)
if xc_pic(i)==xc_pic(j)
y_temp=[y_temp,yc_pic(j)];
else
break;
end
end
yt_median=median(y_temp); %计算y(i)数组的中位数
yt_0=0;
n2=1;
for k=1:length(y_temp) %剔除容限外的y(i)值
if abs(y_temp(k)-yt_median)<=Tol_LineW
yt_0=(yt_0*(n2-1)+y_temp(k))/n2;
n2=n2+1;
end
end
x_curve(count1)=x_temp;
y_curve(count1)=yt_0;
count1=count1+1;
end
end
%剔除曲线中的突变点
xc_smooth=0;
yc_smooth=Ly_pic;
for i=1:length(x_curve)
if abs(y_curve(i)-yc_smooth(end))<100
xc_smooth=[xc_smooth,x_curve(i)];
yc_smooth=[yc_smooth,y_curve(i)];
end
end
%添加图上坐标偏移值
xc_smooth=xc_smooth+x0_pic;
yc_smooth=yc_smooth+y0_pic;
%坐标转换
x_real=(xc_smooth-x0_pic)*Lx_real/Lx_pic+x0_real; %以坐标轴的图上坐标-真实坐标比例关系为基准获得数据的真实坐标x;
y_real=(y1_pic-yc_smooth)*Ly_real/Ly_pic+y0_real; %以坐标轴的图上坐标-真实坐标比例关系为基准获得数据的真实坐标y;
%展示提取结果
subplot(2,1,1);
imshow(img_1,'InitialMagnification','fit');
subplot(2,1,2);
plot(x_real,y_real);
%保存提取结果
save('DataExtraction.mat','x_real','y_real');
%}
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
本程序可对论文/产品手册等资料中的各类曲线图片实现数据的提取与复原。不仅使用于包含单色单曲线的图片,亦可提取多色多曲线图片中任意曲线上的数据。 使用时,首先对图片坐标轴四点进行定位,随后按照提示进行操作即可完成数据提取。 "I thought what I'd do was I'd pretend I was one of those deaf-mutes, or should I?"
资源推荐
资源详情
资源评论
收起资源包目录
DataExtraction_RGB_Demo.rar (2个子文件)
Pic_demo.jpg 28KB
DataExtraction_RGB_Demo.m 5KB
共 2 条
- 1
忘了面孔的Batou
- 粉丝: 696
- 资源: 15
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
- 3
- 4
- 5
- 6
前往页