Как сохранить измененное изображение в MATLAB?

Я хочу прочитать изображение в MATLAB, нарисовать на нем прямоугольник, а затем Сохранить Изображение.

кроме того, я только изучаю MATLAB--пожалуйста, будьте осторожны. Кажется, это должно быть просто, но я не могу этого сделать.

im = imread('image.tif');
imshow(im);
rectangle('Position', [100, 100, 10, 10]);
imwrite(im, 'image2.tif');

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

FWIW, я уже пробовал saveas(), но это дает мне огромное изображение. Есть есть способ использовать saveas() и сделать сохраненное изображение правильного размера?

8 ответов


причина, по которой прямоугольник не отображается в сохраненном изображении, заключается в том, что вы не изменяете переменную im, в котором хранятся данные изображения. Прямоугольник-это просто объект графика, отображаемый поверх построенного изображения. Вы должны изменить сами данные изображения.

Как правило, изображения, считываемые в MATLAB, загружаются как матрица N-by-M-by-3 (т. е. пиксельное изображение N-by-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 и indexed), Я бы проверил документацию для 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');

и продолжайте работать с ним:)

С Уважением, Лора


на самом деле ошибка на сайте MathWorks об этой проблеме. Жаль, что они не дают реального ответа (как, ИМХО, поднятие линейки к монитору не является реальным решением).

С помощью print команда, вы должны вручную изменить -r параметр до тех пор, пока размер сохраненного изображения не будет соответствовать размеру входного изображения. The -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 параметр, пока он не выглядит правильно, и вуаля!


после jacobko ответ. Установка цифр 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 см при пересчете 80dpi без границы вокруг оси.


Если вы хотите сохранить im, вы должны сначала изменить его значение. Я не знаком с функцией rectangle, но вы можете сделать следующее (грубая сила):

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');

Примечание, код выше для серого изображения масштаба, если ваше изображение изображение РГБ, то вам будет нужно сделать следующее:

 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);