Подтвердить что ты не робот

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

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

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

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

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

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

4b9b3361

Ответ 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);