Как я могу сохранить измененное изображение в MATLAB?
Я хочу прочитать изображение в MATLAB, нарисовать на нем прямоугольник, а затем сохранить изображение.
Кроме того, я только учусь MATLAB- пожалуйста, будьте нежны. Кажется, это должно быть просто, но я не могу этого сделать.
im = imread('image.tif');
imshow(im);
rectangle('Position', [100, 100, 10, 10]);
imwrite(im, 'image2.tif');
Даже если я вижу прямоугольник на изображении, сохраненное изображение не отображает прямоугольник. Как я могу сохранить изображение и показать прямоугольник?
FWIW, я уже пробовал saveas()
, но это дает мне огромное изображение. Есть ли способ использовать saveas()
и сделать сохраненное изображение правильного размера?
8 ответов
На самом деле на сайте MathWorks есть ошибка об этой проблеме. Жаль, что они не дают реального ответа (поскольку, ИМХО, держать линейку на мониторе не является реальным решением).
С использованием print
команда, вы должны вручную изменить -r
параметр, пока размер сохраненного изображения не будет соответствовать размеру входного изображения. -r
Параметр указывает DPI сохраненного изображения. Поскольку большинство экранов имеют разные DPI, единого решения для всех не существует.
im = imread('image.tif');
f = figure, imshow(im, 'Border', 'tight');
rectangle('Position', [100, 100, 10, 10]);
print(f, '-r80', '-dtiff', 'image2.tif');
Используйте код выше, настройте -r
Параметр пока не выглядит правильно, и вуаля!
Причина, по которой прямоугольник не отображается на сохраненном изображении, заключается в том, что вы не изменяете переменную im
, в котором хранятся данные изображения. Прямоугольник - это просто объект графика, отображаемый поверх изображения. Вы должны изменить сами данные изображения.
Как правило, изображения, считываемые в MATLAB, загружаются как матрица размером N × M × 3 (то есть изображение пикселя размером N × M со значениями RGB (красный-зеленый-синий) для каждого пикселя). Обычно данные изображения относятся к типу данных uint8, поэтому значения RGB варьируются от 0 до 255. Если вы хотите изменить значение RGB для данного пикселя, вы должны сделать следующее:
im = imread('test.jpg'); % Load a jpeg image
im(1,1,1) = 255; % Change the red value for the first pixel
im(1,1,2) = 0; % Change the green value for the first pixel
im(1,1,3) = 0; % Change the blue value for the first pixel
imwrite(im,'new.jpeg'); % Save modified image
Существуют различные способы изменения более одного пикселя за раз (т. Е. Прямоугольной области), что потребует от вас изучения способов индексации многомерных массивов. Для получения более подробной информации о том, как различные типы изображений считываются в MATLAB (т. Е. Truecolor и индексированные), я бы проверил документацию на imread.
На вопрос в верхней части, есть довольно простое решение, предоставленное Matlab:
% you so far
im = imread('image.tif');
imshow(im);
rectangle('Position', [100, 100, 10, 10]);
% now you use "getframe" and "frame2im"
f = getframe(gca);
im = frame2im(f);
imwrite(im,'image2.tif');
Это отлично сработало, когда я нарисовал прямоугольник на изображении и попытался его сохранить. Если вы хотите продолжать работать с ним, просто добавьте
imread('image2.tif');
и продолжай работать с ним:)
С наилучшими пожеланиями, Лаура
Вслед за Якобко ответ. Установка свойств paperposition фигур и paperunits, а также единиц измерения осей и свойств позиции обычно дает желаемые результаты без необходимости изменять разрешение. Так,
>> im = imread('image.tif');
>> f = figure, imshow(im);
>> r=rectangle('Position',[100, 100,10,10]);
>> set(r,'edgecolor','b') % change the color of the rectangle to blue
>> set(f,'units','centimeters','position',[1 1 2.5 2.5]) % set the screen size and position
>> set(f,'paperunits','centimeters','paperposition',[1 1 2.5 2.5]) % set size and position for printing
>> set(gca,'units','normalized','position',[0 0 1 1]) % make sure axis fills entire figure
>> print(f, '-r80','-dtiff','image2.tif')
Выходное изображение, image2.tif, теперь будет иметь размер 2,5 на 2,5 см с разрешением 80 точек на дюйм без границы вокруг оси.
Если вы хотите сохранить im, вы должны сначала изменить его значение. Я не знаком с функцией прямоугольника, но вы можете сделать следующее (грубая сила):
im = imread('image.tif');
im(100:110,100)=0;
im(100:110,110)=0;
im(100,100:110)=0;
im(110,100:110)=0;
imshow(im);
imwrite(im, 'image2.tif');
Обратите внимание, что приведенный выше код предназначен для изображения в оттенках серого. Если ваше изображение является изображением RGB, вам нужно будет сделать следующее:
im(100:110,100,:)=0;
....
Вы могли бы использовать getframe
чтобы получить измененное изображение из окна рисунка. Я думаю, что вы могли бы передать поля cdata и colormap структуры, возвращаемой getframe
в imwrite
как изображение и его цветовую карту соответственно.
[f,p] = uigetfile('*.*');
I = imread([p,f]);
imwrite(I,'img12.tif');%
Любое имя, которое мы можем дать для сохранения изображения
Он автоматически сохранится в вашей папке, и вы сможете просмотреть любое изображение.
close all; clear; clc;
r = 240 ; c = 320;
fig = figure('Visible', 'off');
imshow( zeros(r,c) );
hold on;
plot([c-fix(c/2),c-fix(c/2)],[r-fix(r/2),r-fix(r/2)],'r*', 'MarkerSize', 10 );
% Sets position and size of figure on the screen
set(fig, 'Units', 'pixels', 'position', [100 100 c r] );
% Sets axes to fill the figure space
set(gca, 'Units', 'pixels', 'position', [0 0 c+1 r+1 ]);
% Sets print properties; Looks like 1 pixel = (3/4)th of a point
set(fig, 'paperunits', 'points', 'papersize', [fix((c-1)*(3/4))+1 fix((r-1)*(3/4))+1]);
set(fig, 'paperunits', 'normalized', 'paperposition', [0 0 1 1]);
print( fig, sprintf('-r%d', ceil(72*(4/3))), '-dpng', 'image.png' );
im = imread( 'image.png');
figure; imshow(im);