В MATLAB, как мне построить изображение и сохранить результат без его отображения?

39

Этот вопрос начинается с того, где этот вопрос заканчивается. MATLAB имеет мощную и гибкую систему отображения изображений, которая позволяет использовать команды imshow и plot для отображения сложных изображений, а затем сохранить результат. Например:

im = imread('image.tif');
f = figure, imshow(im, 'Border', 'tight');
rectangle('Position', [100, 100, 10, 10]);
print(f, '-r80', '-dtiff', 'image2.tif');

Это отлично работает.

Проблема заключается в том, что если вы делаете большую обработку изображений, она начинает быть реальным перетаскиванием, чтобы показать каждое созданное изображение - вы в основном хотите просто сохранить их. Я знаю, что могу начать прямо писать изображение, а затем сохранить результат. Но использование plot/rectangle/imshow настолько простое, поэтому я надеюсь, что есть команда, которая может позволить мне вызвать plot, imshow и т.д., Не отображать результаты, а затем сохранять то, что было бы отображено. Кто-нибудь знает какие-нибудь быстрые решения для этого?

Альтернативно, быстрый способ поместить сплайн на растровое изображение может работать...

Теги:
graphics

5 ответов

41
Лучший ответ

Когда вы создаете фигуру, вы устанавливаете для свойства Visibile значение Off.

f = figure('visible','off')

Что в вашем случае было бы

im = imread('image.tif');
f = figure('visible','off'), imshow(im, 'Border', 'tight');
rectangle('Position', [100, 100, 10, 10]);
print(f, '-r80', '-dtiff', 'image2.tif');

И если вы хотите снова просмотреть его, вы можете сделать

set(f,'visible','on')
20

Простой ответ на ваш вопрос дается Bessi и Mr Fooz: установите 'Visible' установив для цифры значение "выключено". Хотя это очень легко использовать команды, такие как IMSHOW и PRINT, чтобы генерировать цифры, я подведу итог, почему я думаю, что это не обязательно лучший вариант:

  • Как проиллюстрировано г-ном Fooz, есть много других факторов, которые возникают при попытке сохранить фигуры как изображения. Тип вывода, который вы получаете, будет зависеть от многих настроек фигуры и осей, таким образом увеличивая вероятность того, что вы не получите нужный вам результат. Это может быть особенно проблематично, если у вас установлены невидимые цифры, так как вы не заметите каких-либо несоответствий, которые могут быть вызваны изменением значения по умолчанию для фигуры или осей. Короче говоря, ваш выход становится очень чувствительным к ряду настроек, которые вам необходимо будет добавить к вашему коду для управления вашим выходом, как показывает пример г-на Fooz.

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

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

im = imread('image.tif');
[r,c,d] = size(im);
x0 = 100;
y0 = 100;
w = 10;
h = 10;
x = [x0:x0+w x0*ones(1,h+1) x0:x0+w (x0+w)*ones(1,h+1)];
y = [y0*ones(1,w+1) y0:y0+h (y0+h)*ones(1,w+1) y0:y0+h];
index = sub2ind([r c],y,x);
im(index) = 0;
im(index+r*c) = 0;
im(index+2*r*c) = 0;
imwrite(im,'image2.tif');
4

Вот совершенно другой ответ:

Если вам нужен файл изображения, почему бы просто не сохранить изображение вместо всего рисунка?

im = magic(10)
imwrite(im/max(im(:)),'magic.jpg')

Тогда докажите, что он сработал.

imshow('magic.jpg')

Это можно сделать для индексированных и RGB также для разных форматов вывода.

4

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

% prevent the figure window from appearing at all
f = figure('visible','off'); 
% alternative way of hiding an existing figure
set(f, 'visible','off'); % can use the GCF function instead

% If you start getting odd error messages or blank images,
% add in a DRAWNOW call.  Sometimes it helps fix rendering
% bugs, especially in long-running scripts on Linux.
%drawnow; 

% optional: have the axes take up the whole figure
subplot('position', [0 0 1 1]); 

% show the image and rectangle
im = imread('peppers.png');
imshow(im, 'border','tight');
rectangle('Position', [100, 100, 10, 10]);

% Save the image, controlling exactly the output
% image size (in this case, making it equal to 
% the input's). 
[H,W,D] = size(im);
dpi = 100;
set(f, 'paperposition', [0 0 W/dpi H/dpi]);
set(f, 'papersize', [W/dpi H/dpi]);
print(f, sprintf('-r%d',dpi), '-dtiff', 'image2.tif');

Если вы хотите отобразить фигуру в матрице, введите "help @avifile/addframe", а затем извлеките подфункцию, называемую "getFrameForFigure". Это функция, предоставляемая Mathworks, которая использует некоторые (в настоящее время) недокументированные способы извлечения данных из рисунка.

0

Вы можете использовать - noFigureWindows, чтобы отключить все цифры.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню