1

我试图在同一个图形窗口中以 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”。

4

1 回答 1

0

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

if (n==1)
    gcapos=get(gca,'position');
else
    set(gca,'position',gcapos);
end
于 2013-07-12T11:19:58.343 回答