Matlab手动点取图形曲线数据并重画
z=imread('1.jpg');
imshow(z)
I=imread('f:/1.jpg')
imshow(I)
1: 若fig图像文件存在,而其数据丢失,可直接使用函数从fig文件中将数据导出
①open('d:\filename.fig');% filename是文件名
% 取出曲线的handle,这里gca表示当前图形的CurrentAxes属性
% 如果图中有多条曲线,lh为一个数组
lh = findall(gca, 'type', 'line');
% 取出x轴数据
xc = get(lh, 'xdata');%多条曲线,若取第i条线的数据,则xc=get(lh(i),'xdata')
% 取出y轴数据
yc = get(lh, 'ydata');
%结果显示
xc %x轴数据矩阵
yc %y轴数据矩阵
解释:
gcf 返回当前Figure对象的句柄值
gca返回当前axes对象的句柄值
gco返回当前鼠标单击的句柄值,该对象可以是除root对象外的任意图形对象,并且Matlab 会把当前图形对象的句柄值存放在Figure的CurrentObject属性中。
2:若为非fig格式的其他常见图片格式,如.jpg,.png等等,可采取手动点击和程序取值等方式。
①手动点击取值作图
clear all;
clc;
y=imread('d:\xx.png'); %读取该图
imshow(y); %显示该图
set(gcf,'outerposition',get(0,'screensize')); %使该图显示最大化,便于取点
[x0,y0] = ginput; %利用鼠标取点,按回车键结束。
%这个时候可以顺序点取图中坐标轴的,左下,左上,右上,右下四个点。
%存取角点坐标信息
save corner.mat x0 y0
%开始撷取其中一条实线上的点,按你需要的精度,点取任意多的点,回车结束[x1,y1] = ginput;
%存取曲线1的点源信息
save line1.mat x1 y1
%其余曲线类推
%存取曲线2的点源信息
[x2,y2] = ginput;
save line2.mat x2 y2
%重画
%因为屏幕坐标是从左上角为坐标原点开始的,需要做些变换根据实际修改为自己的坐标
%四个角点对应的坐标为(0,0)(0,4),(8,4),(8,0)
x1 = (x1-min(x0))*8.0/(max(x0)-min(x0));
y1 = (y1-max(y1))*4.0/(min(y0)-max(y0));
plot(x1,y1,'r-','Markersize',5);%修改线的属性设置
hold on;
x2 = (x2-min(x0))*8.0/(max(x0)-min(x0));
y2 = (y2-max(y2))*4.0/(min(y0)-max(y0));
plot(x2,y2,'m-','Markersize',5);%修改线的属性设置
axis equal;
axis([0 8 0 4]);
set(gcf,'outerposition',get(0,'screensize'));
如果是彩图,则M为三维矩阵,可分解为三色二维矩阵:
R=M(:,:,1)
G=M(:,:,2)
B=M(:,:,3)
处理后,显示为:imshow(M1)
[Z,cmap]=imread('lyl.jpg');
>> imshow(Z)
>> axis on
(3)提取图片中曲线的数据:
如图:
假设图片保存在D盘,图片名字为:一般图像.jpg,jpg格式。
打开matlab ,如下输入:
>> y=imread('d:\一般图像.jpg'); %读取该图
>> imshow(y) %显示该图
>> set(gcf,'outerposition',get(0,'screensize')); %使该图显示最大化,便于取点
>> [x0,y0] = ginput; %利用鼠标取点,按回车键结束。这个时候应顺序点取图中坐标轴
左下,左上,右上,右下四个点。
>> [x1,y1] = ginput; %开始撷取其中一条实线上的点,按你需要的精度,点取任意多的点,
回车结束
%因为位图的屏幕坐标是从左上角为坐标原点开始的,需要
做些变换:
>> x1= (x1-min(x0))*350/(max(x0)-min(x0))+375;%如果坐
标原点不为0,则需在该轴加上
上坐标轴数(此处为x轴加上375);350是图像X轴的标长(725-375=350);3.5*10^5是图像Y轴的标长(3.5*10^5-0=3.5*10^5)
>> y1=(y1-max(y1))*3.5*10^5/(min(y0)-max(y0)); %y轴做同样的处理;
>> plot(x1,y1,'k.','Markersize',5); %画图,设置为黑色的点图
>> axis([400,700,0,350000]);%定义坐标范围
>> set(gcf,'outerposition',get(0,'screensize')); %使该图显示最大化,便于观察Matlab手动点取图形曲线数据并重画
比如有下面这么一张图,我们要用鼠标取得曲线的数值,并记录下来:
clear all;
clc;
y=imread('./input.JPG'); %读取该图
imshow(y); %显示该图
set(gcf,'outerposition',get(0,'screensize')); %使该图显示最大化,便于取点
[x0,y0] = ginput; %利用鼠标取点,按回车键结束。
%这个时候可以顺序点取图中坐标轴的,左下,左上,右上,右下四个点。
%存取角点坐标信息
save corner.mat x0 y0
%开始撷取其中一条实线上的点,按你需要的精度,点取任意多的点,回车结束
[x1,y1] = ginput;
%存取曲线1的点源信息
save line1.mat x1 y1
%其余曲线类推
%重画
%因为屏幕坐标是从左上角为坐标原点开始的,需要做些变换
%四个角点对应的坐标为(0,0)(0,4),(8,4),(8,0)
x1 = (x1-min(x0))*8.0/(max(x0)-min(x0));
y1 = (y1-max(y1))*4.0/(min(y0)-max(y0));
plot(x1,y1,'k.','Markersize',5);
axis equal;
axis([0 8 0 4]);
set(gcf,'outerposition',get(0,'screensize'));
六。图像处理与动画制作
例1-26 有一图像文件flower.jpg,在图形窗口显示该图像。程序如下:
[x,cmap]=imread('flower.jpg'); %读取图像的数据阵和色图阵image(x);colormap(cmap);
axis image off %保持宽高比并取消坐标轴