Как я могу сохранить измененный образ в MATLAB?

1129 Это простое задание. = является оператором присваивания.

Давайте не будем обращать внимания на следующие пункты.

  1. В Java, когда объект создан и доступен через. ссылка. Ссылка ссылается на объект.
  2. Одновременно одна ссылка может ссылаться только на один объект.
  3. Ссылка типа X может ссылаться на объект типа X или любые подтипы (расширение в случае, если X является классом или реализацией если X является интерфейсом).

Теперь предположим, что есть два класса Super и Sub такие, что Sub extends Super.

 SuperClass reference = new SubClass();  

Это разрешено, поскольку подкласс наследует от суперкласса. Выше у нас есть объект типа SubClass, созданный в куче, и он доступен через. ссылка с именем reference

Обратите внимание, что ссылка типа SubClass не может ссылаться на объект из SuperClass. Посмотрим вкратце, почему так? Если бы ссылка типа SubClass позволяла ссылаться на Объект типа SuperClass, тогда было бы разрешено вызывать дополнительные методы (функции), определенные в SubClass (SubClass унаследовала бы все методы из SuperClass и также определил бы несколько дополнительных методов). Теперь это привело бы к сбою приложения, поскольку у объекта SuperClass есть только методы, определенные в SuperClass, но нет дополнительных методов, определенных в SubClass. Следовательно, компилятор предотвращает это во время компиляции. Это ошибка времени компиляции, чтобы иметь ссылку типа SubClass, ссылающуюся на объект типа SuperClass

Теперь давайте посмотрим на код, как упомянуто в строке

 SuperClass a = new SuperClass();
 SubClass b = new SubClass();
 a = b; 

1: У нас есть объект SuperClass, на который ссылается переменная типа SuperClass с именем a

Строка 2: У нас есть объект SubClass, на который ссылается переменная типа SubClass с именем b

Строка 3: у нас есть назначение, в котором a назначено для ссылки на тот же объект, что и в b. Итак, теперь у нас есть обе ссылки, ссылающиеся на объект типа SubClass, созданный в строке 2. Объект typer SuperClass, созданный в строке 1 (с текущим доступным кодом, упомянутым в вопросе), не имеет каких-либо ссылок, поэтому он пригоден для сбора мусора.

13
задан gnovice 5 May 2017 в 06:18
поделиться

6 ответов

Существует на самом деле ошибка на сайте MathWorks об этой проблеме. Слишком плохо они не обстоятельно объясняют реальный ответ (поскольку, по моему скромному мнению, держа линейку к Вашему монитору не действительное решение).

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

10
ответ дан 1 December 2019 в 17:26
поделиться

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

Как правило, чтение изображений в MATLAB загружается как матрица N на М на 3 (т.е. изображение N на M пиксели с RGB (red-green-blue) значения для каждого пикселя). Обычно, данные изображения являются 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 (т.е. истинный цвет по сравнению с индексируемым), я проверил бы документацию на imread.

19
ответ дан 1 December 2019 в 17:26
поделиться

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

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;
 ....
3
ответ дан 1 December 2019 в 17:26
поделиться

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

7
ответ дан 1 December 2019 в 17:26
поделиться

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

2
ответ дан 1 December 2019 в 17:26
поделиться
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);
1
ответ дан 1 December 2019 в 17:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: