изображение слишком велико, чтобы поместиться на экране (MATLAB) - PullRequest
5 голосов
/ 13 сентября 2011

Я знаю, что это всего лишь предупреждение, и оно не повлияет на код .. но моя проблема в том, что мне нужно показать изображение в его реальном размере без какого-либо уменьшения масштаба ... возможно ли это в imshow функции Есть ли параметры, которые делают это?

спасибо всем

Ответы [ 3 ]

3 голосов
/ 14 сентября 2011

Решение, данное @ Jonas , за которое я уже проголосовал, действительно хорошо.Позвольте мне предложить некоторые незначительные улучшения, чтобы он обрабатывал случай, когда фигура изменяется:

%# read an image and make it large
img = imread('autumn.tif');
img = repmat(img, [10 10]);

%# new figure
hFig = figure;

%# try show image at full size (suppress possible warning)
s = warning('off', 'Images:initSize:adjustingMag');
imshow(img, 'InitialMagnification',100, 'Border','tight')
warning(s);

%# handle figure resize events
hAx = gca;
set(hFig, 'ResizeFcn',{@onResize,hAx})

%# call it at least once
feval(@onResize,hFig,[],hAx);

%# enable panning tool
pan on

Ниже приводится функция обратного вызова изменения размера:

function onResize(o,e,hAx)
    %# get axes limits in pixels
    oldUnits = get(hAx, 'Units');    %# backup normalized units
    set(hAx, 'Units','pixels')
    pos = get(hAx, 'Position');
    set(hAx, 'Units',oldUnits)       %# restore units (so it auto-resize)

    %# display the top left part of the image at magnification 100%
    xlim(hAx, [0 pos(3)]+0.5)
    ylim(hAx, [0 pos(4)]+0.5)
end

screenshot

Скорее всего, вы можете улучшить это, чтобы при изменении размера фигуры вы не всегда возвращались в верхний левый угол, а сохраняли текущую позицию.

3 голосов
/ 14 сентября 2011

Одно из решений, которое должно сработать, - это отобразить изображение, а затем изменить пределы осей, чтобы для каждого пикселя изображения был один пиксель экрана:

%# read an image and make it large
img = imread('autumn.tif');
img = repmat(img,[10,10]);

%# turn off the warning temporarily, we're going to fix the problem below
%# Note that in R2011b, the warning ID is different!
warningState = warning('off','Images:initSize:adjustingMag');
figure
imshow(img)
warning(warningState);


%# get axes limits in pixels
set(gca,'units','pixels')
pos = get(gca,'position')

%# display the top left part of the image at magnification 100%
xlim([0.5 pos(3)-0.5]),ylim([0.5 pos(4)-0.5])

Теперь вы можете выбрать руку (инструмент панорамирования) и перемещать изображение по необходимости.

0 голосов
/ 27 апреля 2012

Примечание. Чтобы отцентрировать изображение (вместо показа в верхнем левом углу), используйте

    xlim([(w_image - w_window) / 2, (w_image + w_window) / 2]);
    ylim([(h_image - h_window) / 2, (h_image + h_window) / 2]);

где w_image и h_image - размеры изображения, а w_window и h_window - приведенные выше ответы pos (3) и pos (4) соответственно.

...