"Вычисления, визуализация и программирование в среде MATLAB 5.x" - читать интересную книгу автора (Мартынов Н. Н., Иванов А. П.)

Набор цветов (в количестве ш штук), называемый палитрой (colormap), можно оформить в виде матрицы размером m x 3 типа double. Эту матрицу система MATLAB позволяет хранить (и далее использовать) только в этом виде. Матрицу цветов можно получить функцией capture, а можно и сформировать в результате вычислений или прямых присваиваний. Например, матрица mapl
mapl(l,l) = 0.12; mapl(1,2) = 0.123; mapl(1,3) = 0.987;
mapl(2,1) = 0.456; mapl(2,2) = 0.7; mapl(2,3) = 0.22;
mapl (3,1) = 0.88; mapl(3,2) = 0.19; mapl(3,3) = 0.611;
mapl (4,1) = 0.255; mapl(4,2) = 0.298; mapl(4,3) = 0.128;
mapl(5,1) = 0.01; mapl(5,2) = 0.78; mapl(5,3) = 0.60;
задает набор из пяти цветов. Каждая строка соответствует одному цвету. Элементы строки (слева направо) задают красную, зеленую и синию составляющие цвета.
82
Глава 2. Визуализация результатов вычислений
Далее сформируем матрицу к х L типа uint8, каждый элемент которой будет равен одному из номеров (минус единица) строк таблицы цветов mapl. Такой матрицы вместе с матрицей цветов будет достаточно, чтобы показать на экране компьютера массив пикселов, то есть произвольное растровое изображение.
Например, матрица XI
XI = uint8( [14 13 2/40213])
задает массив типа uint8 размером 2x5 пикселов. Этот массив занимает в памяти 10 байт, а не 80 байт, как было бы в случае массива типа double. Согласно матрице XI первый пиксел в первом ряду имеет цвет, задаваемый второй строкой матрицы mapl, второй пиксел в этом же ряду соответствует пятой строке матрицы mapl и т. д.
Итак, для примера мы вручную сформировали матрицу цветов mapl типа double, состоящую из 5 строк (задает пять цветов), и матрицу XI размером 2x5, формирующую растровое изображение из 10 пикселов (2 ряда по 5 пиксел в каждом). Чтобы заставить систему MATLAB отобразить в одном из своих графических окон сформированную нами картину пикселов, вызываем функции image и colormap:
image( XI ); colormap( mapl );
В результате создается графический объект системы MATLAB типа image, которому в графическом окне соответствует следующее растровое изображение (см. рис. 2.29).
•¦» Fiqure No. 1
?ile_' Edit Window Help 0.5
Рисунок 2.29
Поскольку мы не управляем размером графического окна системы MATLAB, то оно появляется на экране с некоторым размером, заданным по умолчанию. Так как наше изображение состоит из двух рядов по 5 пикселов в каждом, а это очень мелкое изображение (физический размер пиксела экрана примерно равен 0,2 мм), то MATLAB по умолчанию масштабирует его (увеличивает), чтобы можно было разглядеть это изображение. Если требуется отменить такое масштабирование, то следует явно указать нужные размеры:
MATLAB 5.x. Вычисления, визуализация, программирование 83
[ m , n ] = size( XI );
figure( 'Units', 'pixels', 'Position', [100 100 n m] );
image(XI ); colormap( mapl ) ;
set (gca/Position',[0 0 1 1]);
Здесь размеры тип изображения XI навязываются в качестве физического размера картинки в графическом окне системы MATLAB. Для слишком маленьких картинок при этом ничего хорошего не получится, однако для изображений графиков функций это как раз самый подходящий вариант, иначе сразу же будут сильные искажения исходного изображения. Последняя инструкция (оператор) из представленного фрагмента кода заставляет объект axes заполнить собой все внутреннее пространство графического окна. Это нужно делать в обязательном порядке для изображений, ранее сохраненных в массивах данных командой capture, так как эта команда сохраняет информацию о всех пикселах внутренней (клиентской) области графического окна системы MATLAB.
Чтобы отобразить в графическом окне системы MATLAB уже готовые картинки, записанные в файлах, нужно прочесть содержимое этих файлов функцией imread. Ранее мы записывали изображения в файлы с помощью функции imwrite. Теперь их можно прочесть:
[ Х2, тар2 ] = imread( 'myfilel.jpg' )
и показать в графическом окне. Заметим только, что файл должен быть в текущем каталоге системы MATLAB, иначе его нужно указать вместе с полным путем к нему.
Рассмотренные данные для объекта image состоят из двух матриц, одна из которых построчно задает цвета, а вторая своими элементами указывает входы в таблицу (матрицу) цветов. Этот вариант строения объекта типа image называется более точно как indexed image {индексированное изображение). Есть и другой тип объекта image - так называемый truecolor image (картинки с очень большим количеством цветов-до 16 миллионов). Этот второй тип объектов image устроен по-другому.
Для объектов truecolor image таблица цветов не требуется, так как массивы данных таких объектов непосредственно определяют цвета. Эти массивы имеют размер m x n х 3, то есть являются массивами размерности 3. Величины m и п определяют размер картинки на экране (ixn пикселов), а вдоль третьего направления располагаются RGB-составляющие цвета каждого пиксела.
Трехмерные массивы данных для объектов truecolor image могут иметь тип double или тип uint8. В первом случае каждый элемент такого массива является вещественным числом от 0 до 1 и занимает в памяти компьютера 8 байт, а во втором случае каждый элемент является целым числом типа uint8 со значением от 0 до 255 и занимает в памяти компьютера 1 байт. Последний случай
84
Глава 2. Визуализация результатов вычислении
предпочтительнее. Зададим, к примеру, следующий трехмерный массив типа uint8 для изображения truecolor:
xTrue(l,l,l)=uint8(127); xTrue(1,I,2)=uint8(127);
xTrue(l,l,3)=uint8(127)
xTrue(l,2,2)=uint8(12);
xTrue(l,3,l)=uint8(245)
xTrue(l,3,3)=uint8(l) ;
xTrue(2,l,2)=uint8(203).
xTrue(2,2,l)=uint8(100)
xTrue(2,2,3)=uint8(80);
xTrue(l,2,l)=uint8(19);
xTrue(l,2,3)=uint8(255);
xTrue (1,3,2)=uint8 (127);
xTrue(2,l,l)=uint8(6);
xTrue(2,l,3)=uint8(128);
xTrue(2,2,2)=uint8(l);
xTrue(2,3,l)=uint8(60);