xjzuo 发表于 2007-7-21 17:06

[讨论] 图片曲线如何用Matlab取点并画图

最近忙于研究一些有趣的问题,其中涉及一些图片曲线的处理问题。
我发现一个有趣的事情---
举个简单例子,当用Matlab对图片曲线取点,然后画图时,发现画出的图形竟然是反的!
我想了一个办法可以实现原曲线图形,但坐标刻度反了,目前我还没有想到更好的办法,不知各位有何高见,欢迎讨论。

附件是曲线的图片,以下是我的代码:
%%%%%%%%%%%%%%%%%%%%
a=imread('conduct1.jpg');
imshow(a)
=ginput         % 取点
plot(x,y,'b:',x,y,'o')
p=findobj('type','axes')
set(p,'Ydir', 'reverse')
%%%%%%%%%%%%%%%%%%%%

当然更复杂的是刻度与原图形一致.不过作适当标度,这个问题倒不难解决.
目前的问题是不反转y轴,能否画出原图片中的曲线? 欢迎各位参与讨论.

花如月 发表于 2007-7-21 19:03

回复 #1 xjzuo 的帖子

问题的原因:
axes显示图像以后坐标会有变化:左上角表示(1,1),右下角为(M,N)。其中M和N分别为图像的行数和列数。而plot、text等绘图默认的坐标是坐下角(0,0),右上角(1,1)。可以用下边的程序进行验证:

clear;
a=imread('lena.bmp');
imshow(a)
hold on;
text(1,1,'\heartsuit','Color','red')
=ginput         % 取点
plot(x,y,'--rs','LineWidth',3,...
                'MarkerEdgeColor','k',...
                'MarkerFaceColor','g',...
                'MarkerSize',10)
figure(2)
text(1,1,'\heartsuit','Color','red')
text(0,0,'\heartsuit','Color','red')
应该是在你的imshow(a)指令后加个hold on就解决问题了

[ 本帖最后由 花如月 于 2007-7-21 19:09 编辑 ]

花如月 发表于 2007-7-21 19:16

又想了一下,虽然可以解决问题。不过画的曲线在图上,程序稍作修改可以不用翻转坐标而且不留原图的痕迹:

a=imread('lena.bmp');
b=a;
b(:,:)=255;
imshow(a)
=ginput         % 取点
imshow(b);
hold on;
plot(x,y,'b:',x,y,'o')
觉得这种方法比反正坐标好理解点:handshake

[ 本帖最后由 无水1324 于 2007-7-22 09:55 编辑 ]

花如月 发表于 2007-7-21 19:59

晕了,貌似刚才的可以不用翻转y坐标轴。axis on以后结果和翻转的一样。应该用下面的程序:
clear;
a=imread('lena.bmp');
imshow(a)
=size(a)
=ginput         % 取点
plot(x,M-y,'--rs','LineWidth',3,...
                'MarkerEdgeColor','k',...
                'MarkerFaceColor','g',...
                'MarkerSize',10)
各位见笑了:@D,继续讨论哦,好的办法继续贴。

[ 本帖最后由 花如月 于 2007-7-21 20:03 编辑 ]

xjzuo 发表于 2007-7-21 21:58

虽然感觉应该还有更好的办法(不用size(a),直接取点后处理,画图),不过还是赞一个!

(当然,我后面已经在实现曲线的平移,抓图等等)

[ 本帖最后由 xjzuo 于 2007-7-21 22:00 编辑 ]

花如月 发表于 2007-7-21 22:11

回复 #5 xjzuo 的帖子

谢谢你的鼓励。显示图像以后,gca.YDir内容都会变成 'reverse'。3楼程序不用size,不过结果和你的程序处理结果一样,会出现坐标刻度与原图形不一致(plot绘图的时候gca.YDir内容是'normal')。用plot(x,M-y,'--rs','LineWidth',3,...
                'MarkerEdgeColor','k',...
                'MarkerFaceColor','g',...
                'MarkerSize',10)
虽然需要计算一次图像的宽度,但相当于对y做了一次翻转,图像和坐标标注都正常了。而原来的虽然翻转了一次标注却有问题。呵呵,期待更精炼的程序

xukyle 发表于 2011-1-17 20:38

好贴! Trein bien!

kuotaoshaw 发表于 2012-3-26 11:39

{:{13}:}

sgwb201 发表于 2012-3-26 22:15

{:4_74:}
页: [1]
查看完整版本: [讨论] 图片曲线如何用Matlab取点并画图