如何在多次迭代中使用imshow()保持100%的放大率?

时间:2013-07-12 08:01:28

标签: matlab image-processing

我试图在100%放大率下在同一个图窗口中显示一组图像。同时,我想在每个图像上应用注释对象。

假设我的输入图像没有超出屏幕尺寸,这就是我所做的:

imagedata = imread('cameraman.tif');

hFig = figure;
hAnnot = [];

for n = 1 : 10 % repeat ten times

    % show and annotate image
    imshow(imagedata, 'InitialMagnification', 100, 'border', 'tight');
    if(isempty(hAnnot) || ~ishandle(hAnnot))
        hAnnot = annotation('arrow', 'color', 'b');
    end


    set(gca, 'units', 'pixels');
    gcapos = get(gca, 'Position');


    % add label to display no of loop
    text(10, 10, [' Loop : ', num2str(n)], 'Color', 'c')

    pause(1);   % pause one second to view

    if(ishandle(hAnnot))
        % remove hAnnot to prevent reappearance in next loop
        delete(hAnnot);

        % check if annotation object is successfully removed
        if(~ishandle(hAnnot))
            hAnnot = [];
        else
            sprintf('hAnnot is not cleared in loop #%d', n);
        end

    end

end

结果显示只有第一张imshow() - 图像以100%放大率显示。和gca的位置在[1 1 256 256]返回,这就是我想要的。

后续图像(从循环2到10)被缩小,现在位置返回[34.2800 29.1600 198.4000 208.6400]。

任何人都可以帮忙解释为什么它会以这种方式运作吗?

我还查看了每个循环中的hFig属性,以确定是否有任何更改。我观察到的唯一区别是'NextPlot'的值 - 其中第一个循环是'replacechildren',而在后续循环中它是'add'。

1 个答案:

答案 0 :(得分:0)

我不知道为什么会这样,但快速解决方法是在第一次迭代中获得该位置并将其设置在其他迭代中:

if (n==1)
    gcapos=get(gca,'position');
else
    set(gca,'position',gcapos);
end