В MATLAB, как мне построить изображение и сохранить результат, не отображая его?
Этот вопрос начинается там, где этот вопрос заканчивается. 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 и т. Д., Не отображать результаты и затем сохранять то, что было бы отображено. Кто-нибудь знает какие-либо быстрые решения для этого?
Кроме того, быстрый способ поместить сплайн на растровое изображение может работать...
5 ответов
При создании фигуры вы устанавливаете для свойства Visibile значение Выкл.
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')
Простой ответ на ваш вопрос дают Бесси и мистер Фуз: установите для параметра "Видимый" значение "Выкл". Хотя для генерации фигур очень легко использовать такие команды, как IMSHOW и PRINT, я резюмирую, почему я считаю, что это не обязательно лучший вариант:
Как видно из ответа г-на Фуза, при попытке сохранить фигуры в виде изображений в игру вступают многие другие факторы. Тип получаемого вами результата будет зависеть от многих параметров фигуры и осей, что увеличивает вероятность того, что вы не получите желаемый результат. Это может быть особенно проблематично, если ваши фигуры установлены как невидимые, поскольку вы не заметите расхождений, которые могут быть вызваны изменением настроек по умолчанию для фигуры или осей. Короче говоря, ваш вывод становится очень чувствительным к ряду настроек, которые вы затем должны будете добавить к своему коду для управления выводом, как показывает пример мистера Фуза.
Даже если вы не просматриваете рисунки в том виде, как они сделаны, вы все равно, вероятно, заставляете 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');
Вот совершенно другой ответ:
Если вам нужен файл изображения, почему бы просто не сохранить изображение вместо всей фигуры?
im = magic(10)
imwrite(im/max(im(:)),'magic.jpg')
Тогда докажите, что это сработало.
imshow('magic.jpg')
Это может быть сделано для индексированных и RGB также для различных форматов вывода.
Я немного расширяю решение Бесси. Я обнаружил, что очень полезно знать, как заставить изображение занимать всю фигуру, и иметь возможность жестко контролировать размер выходного изображения.
% 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 функция, которая использует некоторые (в настоящее время) недокументированные способы извлечения данных из рисунка.
Вы можете использовать -noFigureWindows, чтобы отключить все цифры.