Объект изображения и его свойства

Обработка изображений CData

Примечание

image и команды imagesc создают объекты изображения. Объекты изображения являются дочерними элементами объектов осей, как строка, закрашенная фигура, поверхность и текстовые объекты. Как все графические объекты, объект изображения имеет много свойств, которые можно установить, чтобы подстроить его внешний вид на экране. Самыми важными свойствами объекта изображения относительно внешнего вида является CData, CDataMapping, XData и YData. Эти свойства обсуждены в этом и следующих разделах. Для получения дальнейшей информации о них и всех свойствах объекта изображения, смотрите image.

Свойство CData объекта изображения содержит массив данных. В следующих командах h является указателем объекта изображения, созданного image и матрицами, X и Y являются тем же самым:

h = image(X); colormap(map)
Y = get(h,'CData');

Размерность массива CData управляет, окрашивают ли отображения изображений с помощью палитры или как изображение RGB. Если массив CData двумерен, изображение является или индексируемым изображением или изображением интенсивности; в любом случае изображение отображено с помощью цветов палитры. Если с другой стороны массив CData является m n 3, это отображается как изображение истинного цвета, игнорируя цвета палитры.

Обработка изображений CDataMapping

Свойство CDataMapping управляет, является ли изображением indexed или intensity. Чтобы отобразить индексируемое изображение устанавливает свойство CDataMapping на 'direct', так, чтобы значения массива CData использовались непосредственно в качестве индексов в палитру фигуры. Когда команда image используется с единственным входным параметром, она устанавливает значение CDataMapping к 'direct':

h = image(X); colormap(map)
get(h,'CDataMapping')
ans =

direct

Изображения интенсивности отображены путем установки свойства CDataMapping на 'scaled'. В этом случае значения CData линейно масштабируются, чтобы сформировать индексы палитры. Свойство CLim осей управляет масштабными коэффициентами. Функция imagesc создает объект изображения, CDataMapping которого свойство установлено в 'scaled', и она настраивает свойство CLim родительских осей. Например:

h = imagesc(I,[0 1]); colormap(map)
get(h,'CDataMapping')
ans =

scaled

get(gca,'CLim')
ans =

[0 1]

XData и YData

Свойства XData и YData управляют системой координат изображения. Для изображения m на n XData по умолчанию является [1 n], и YData по умолчанию является [1 m]. Эти настройки подразумевают следующее:

  • Левый столбец изображения имеет x-координату 1.

  • Правый столбец изображения имеет x-координату n.

  • Верхний ряд изображения имеет y-координату 1.

  • Нижний ряд изображения имеет y-координату m.

Система координат для изображений

Используйте систему координат по умолчанию

Отобразите изображение с помощью системы координат по умолчанию. Используйте цвета из карты colorcube.

C = [1 2 3 4; 5 6 7 8; 9 10 11 12];
im = image(C);
colormap(colorcube)

Задайте систему координат

Отобразите изображение и задайте систему координат. Используйте цвета из карты colorcube.

C = [1 2 3 4; 5 6 7 8; 9 10 11 12];
x = [-1 2];
y = [2 4];
figure
image(x,y,C) 
colormap(colorcube)

Добавление текста к данным изображения

Этот пример показывает, как использовать индексацию массива, чтобы растеризировать текст в существующее изображение.

Чертите текст в оси с помощью функции text. Затем получите текст с экрана с помощью getframe и закройте фигуру.

fig = figure;
t = text(.05,.1,'Mandrill Face','FontSize',20,'FontWeight','bold');
F = getframe(gca,[10 10 200 200]);
close(fig)

Выберите любую плоскость получившегося изображения RGB, возвращенного getframe. Найдите пиксели, которые являются черными (черный, 0), и преобразуйте их индексы в индексы с помощью sub2ind. Используйте эти индексы, чтобы "нарисовать" текст в изображение, содержавшееся в MAT-файле mandrill. Используйте размер того изображения плюс местоположения строки и столбца текста, чтобы определить местоположения в новом изображении. Индексируйте в новое изображение, заменив пиксели.

c = F.cdata(:,:,1);
[i,j] = find(c==0);
load mandrill
ind = sub2ind(size(X),i,j);
X(ind) = uint8(255);

Отобразите новое изображение с помощью палитры кости.

imagesc(X)
colormap bone

Дополнительные методы для быстрого обновления изображений

Чтобы увеличить уровень, на котором свойство CData объекта изображения обновляет, оптимизируйте CData и установите некоторую связанную фигуру и свойства осей:

  • Используйте самый маленький возможный тип данных. Используя тип данных uint8 для вашего изображения будет быстрее, чем использование типа данных double.

    Часть процесса установки свойства CData изображения включает копирование матрицы для использования изображения. Полный размер матрицы зависит от размера ее отдельных элементов. Используя меньшие отдельные элементы (i. e., меньший тип данных), уменьшает матричный размер и уменьшает количество времени, должен был скопировать матрицу.

  • Используйте самую маленькую приемлемую матрицу.

    Если скорость, на которой отображено изображение, является вашим самым высоким приоритетом, вы, возможно, должны пойти на компромисс на размере и качестве изображения. Снова, уменьшение размера уменьшает время, должен был скопировать матрицу.

  • Установите предельные свойства режима (XLimMode и YLimMode) ваших осей к manual.

    Если они установлены в auto, то каждый раз объект (такой как изображение, строка, закрашенная фигура, и т.д.) изменяет некоторый аспект своих данных, оси должны повторно вычислить ее связанные свойства. Например, если вы задаете

    image(firstimage);
    set(gca, 'xlimmode','manual',...
    'ylimmode','manual',...
    'zlimmode','manual',...
    'climmode','manual',...
    'alimmode','manual');
    

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

  • Рассмотрите использование объекта movie, если основной момент вашей задачи должен просто отобразить серию изображений на экране.

    Объект MATLAB® movie использует базовые системные ресурсы графики непосредственно, вместо того, чтобы выполнить объектный код MATLAB. Это быстрее, чем повторная установка свойства CData изображения, как описано ранее.

Была ли эта тема полезной?