=
является оператором присваивания.
Давайте не будем обращать внимания на следующие пункты.
Теперь предположим, что есть два класса 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 (с текущим доступным кодом, упомянутым в вопросе), не имеет каких-либо ссылок, поэтому он пригоден для сбора мусора.
Существует на самом деле ошибка на сайте 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à!
Причина, которую прямоугольник не разоблачает в сохраненном образе, состоит в том, потому что Вы не изменяете переменную 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.
Если Вы хотите сохранить, я, необходимо сначала изменить его значение. Я не знаком с прямоугольной функцией, но можно сделать следующий (грубая сила):
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;
....
развитие к ответу 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 точек на дюйм без границы вокруг оси.
Вы смогли использовать getframe
захватить измененное изображение из окна числа. Я думаю, что Вы могли передать cdata и поля карты цветов структуры, возвращенной getframe
кому: imwrite
как изображение и его карта цветов, соответственно.
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);