Как я могу сохранить измененное изображение в MATLAB? - PullRequest
13 голосов
/ 22 февраля 2009

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

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

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

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

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

Ответы [ 8 ]

19 голосов
/ 22 февраля 2009

Причина, по которой прямоугольник не отображается на сохраненном изображении, заключается в том, что вы не изменяете переменную 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 против indexed ), я бы проверил документацию для imread .

13 голосов
/ 06 ноября 2012

к вопросу в верхней части, есть довольно простое решение, предоставленное 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');

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

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

10 голосов
/ 23 февраля 2009

На самом деле ошибка на сайте 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, пока он не будет выглядеть правильно, и вуаля!

7 голосов
/ 23 февраля 2009

после до jacobko ответа. Настройка свойств фигур paperposition и paperunits и свойств оси unit и position обычно дает желаемые результаты без необходимости изменять разрешение , Таким образом,

>> 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 точек на дюйм без границы вокруг оси.

3 голосов
/ 22 февраля 2009

Если вы хотите сохранить 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;
 ....
2 голосов
/ 30 августа 2016
[f,p] = uigetfile('*.*');
I = imread([p,f]);
imwrite(I,'img12.tif');%

Любое имя, которое мы можем дать для сохранения изображения

Автоматически он сохранится в вашей папке, и вы сможете просмотреть любое изображение.

2 голосов
/ 22 февраля 2009

Вы можете использовать getframe, чтобы получить измененное изображение из окна рисунка. Я думаю, что вы могли бы передать поля cdata и colormap структуры, возвращаемой getframe в imwrite, как изображение и его цветовую карту соответственно.

1 голос
/ 30 мая 2009
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);
...