copyobj仅复制整个图像而不是轴

时间:2014-03-17 18:19:50

标签: image matlab image-processing plot

我所拥有的是显示连接组件区域的图表。我想要做的是进一步处理情节图,例如清理一下或imcomplement等等,然后能够将原始图中的轴应用到此图像,并能够提取ylabel

让我用我的代码和一些例子来解释上述问题。

这是我的情节,y轴代表物体区域。这是我想要转移到新图像的重要轴。

enter image description here

由于我对轴感兴趣,我只能使用

复制它
h = findobj(gcf,'type','axes');

这样我就可以在没有轴和边界干扰的情况下使用图形来保存它而没有这些属性

set(gca, 'visible', 'off'); % Hide the axis and borders
hgexport(gcf, 'plot1.jpg', hgexport('factorystyle'), 'Format', 'jpeg');

这就是我得到的:

enter image description here

到目前为止一切顺利。

现在处理或换句话说,根据我的需要改变情节。

plot_img = rgb2gray(imread('plot1.jpg'));
img_bw_plot = im2bw(plot_img, graythresh(plot_img));

[rows cols] = size(plot_img);

new = zeros(size(plot_img));

for i = 1: rows
    for j = 1: cols
        if (img_bw_plot(i,j) == 0)
            new(i, 1:10) = 255;
        end
    end
end

f = figure;

imshow(new);
copyobj(h,f)

这会生成一个奇怪的重叠图像,而不是只复制轴,而是将整个图像复制到new之上。 datacursormode也无法超越重叠图像。

enter image description here

1 个答案:

答案 0 :(得分:1)

首先,我有点困惑,如果你在第一个地方有这个数字,你为什么不用它来提取你的数据:

lines=findobj(gca,'type','line');
y=zeros(1,length(lines));
for i=1:length(lines)
  y(i)=get(lines(i),'ydata');
end

在那里你将获得所有数据。

但是,让我们说原始图形不像一个图形图,你可以访问轴对象的子项(虽然所有这些都被复制在一起,这表明事实并非如此)。你需要意识到的是,MATLAB中的“轴”对象不仅仅是图的轴,而是整个图。例如,当你有5个子图时,每个较小的图都是一个轴对象,图形本身就是它的一个子线,它是一个“线”对象(参考我上面的例子)。

所以经过这个长篇演讲:),一个解决方案就是你可以围绕新绘制的图像手动创建这些轴,而不是像这样复制轴对象:

set(gca,'visible','on');
s=size(new); 
set(gca,'ytick',linspace(1,s(1),7),'yticklabel',linspace(6000,0,7));

这应该可以像在原始图形上一样在y轴上放置7个刻度。相同的方法适用于手动创建x轴的标签。

(我尝试将结果图像放在这里,但我没有足够的声誉这样做。这是在stackoverflow兄弟!)

请注意,这会在图表上创建标签,为您提供相同轴的幻觉,而点的实际坐标实际上取决于您要保存的图像的大小。因此,如果你想确保图像大小相同,你需要调整原始图形的大小,最终得到相同的大小,然后给出0-6000,这将是一个非常大的图像。