Как сохранить измененное изображение в MATLAB?
Я хочу прочитать изображение в MATLAB, нарисовать на нем прямоугольник, а затем сохранить изображение.
Кроме того, я просто изучаю MATLAB - будьте осторожны. Кажется, это должно быть просто, но я не могу это сделать.
im = imread('image.tif');
imshow(im);
rectangle('Position', [100, 100, 10, 10]);
imwrite(im, 'image2.tif');
Даже если я вижу прямоугольник на изображении, сохраненное изображение не отображает прямоугольник. Как сохранить изображение и отобразить прямоугольник?
FWIW, я уже пробовал saveas()
, но это дает мне ОГРОМНОЕ изображение. Есть ли способ использовать saveas()
и сделать сохраненное изображение правильным размером?
Ответы
Ответ 1
На самом деле ошибка на сайте MathWorks об этой проблеме. Слишком плохо, что они не говорят о реальном ответе (так как IMHO, поднятие линейки на ваш монитор не является реальным решением).
Используя команду 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
до тех пор, пока он не будет выглядеть правильно, и voilà!
Ответ 2
Причина, по которой прямоугольник не отображается в сохраненном изображении, заключается в том, что вы не изменяете переменную 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.
Ответ 3
на вопрос в верхней части, существует довольно простое решение, предоставляемое 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');
и продолжайте работать с ним:)
С уважением, Лаура
Ответ 4
после ответа jacobko. Настройка свойств бумаги и свойств бумаги, а также единиц оси и свойств положения обычно дает мне желаемые результаты без необходимости настройки разрешения. Таким образом,
>> 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 см при resouttion 80dpi без границы вокруг оси.
Ответ 5
Если вы хотите сохранить 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;
....
Ответ 6
Возможно, вы сможете использовать getframe
для захвата измененного изображения из окна рисунка. Я думаю, вы могли бы передать поля cdata и colormap структуры, возвращаемой getframe
в imwrite
, как изображение и его цветовую карту соответственно.
Ответ 7
[f,p] = uigetfile('*.*');
I = imread([p,f]);
imwrite(I,'img12.tif');%
Любое имя, которое мы можем предоставить для сохранения изображения
Автоматически он будет сохраняться в вашей папке, и вы можете просматривать любое изображение.
Ответ 8
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);