Imwrite(X,map,'myfile1.jpg')
Создаёт файл myfile1.jpg, который хорошо включать в Internet-страницы для их просмотра браузером Internet Explorer.
Функция capture возвращает матрицу X, соответствующую точкам изображения, и матрицу цветов map (три столбца в формате RGB), использованную в изображении. Каждый элемент матрицы X равен номеру одной из строк матрицы map.
В системе MATLAB по матрицам X и map можно восстановить графическое изображение, применив команды
colormap(map);
image(X);
но этот разговор уже касается объектов image системы MATLAB, которым мы посвятим специальный раздел.
#$+ Показ произвольных растровых изображений.
Произвольное изображение на экране компьютера представляет собой массив пикселов, каждый из которых характеризуется своим цветом. Цвет пиксела определяется тремя составляющими: красным, зелёным и синим (Red, Green, Blue - RGB). Для задания величины составляющей цвета пиксела достаточно одного байта памяти (8 битов), где можно записать целые числа от нуля до 255 (всего 256 значений).
Итак, каждому пикселу экрана должны соответствовать три целых числа в диапазоне от 0 до 255. В системе MATLAB таким целым числам соответствует тип данных, обозначаемый как uint8. Под такой тип данных отводится в памяти всего один байт, вместо 8 байт для обычных вещественных (дробных) чисел типа double. По умолчанию любой переменной в системе MATLAB ставится в соответствие тип double независимо от числовых значений, которые вы присваиваете переменным.
Например, в результате следующей строки кода
iVar1 = 128
создаётся переменная с именем iVar1 и типом double, которой присваивается значение 128. Для хранения такого значения достаточно одного байта памяти, однако для переменной iVar1 типа double отводится 8 байт памяти. Налицо явный перерасход памяти компьютера.
Чтобы избежать такого перерасхода переменную нужно явно объявлять как целую, используя модификатор uint8:
iVar2 = uint8(128);
Так созданная переменная iVar2 считается целой переменной (а не вещественной), и под неё отводится один байт памяти. Такие переменные в системе MATLAB специально предназначены для хранения целых значений от 0 до 255 (с целью экономии памяти) и не предназначены для вычислений! По-крайней мере в версии MATLAB 5.2 это ещё так. В результате для следующего фрагмента
iVar2 = iVar2 + 1;
получаем сообщение об ошибке:
??? Function '+' not defined for variables of class 'uint8'.
Дословно означающее, что операция "сложение" для переменных типа uint8 не определена.
Чтобы узнать (если забыли), какой тип имеет та или иная переменная из рабочего пространства системы MATLAB, нужно ввести и выполнить команду
Whos
в результате в командном окне MATLABа появится следующее сообщение:
из которого видно, что iVar1 является массивом размера 1x1 (то есть фактически скаляром) типа double и занимает в памяти 8 байт, а iVar2 имеет тип uint8 и занимает в памяти только 1 байт (в 8 раз меньше). При этом обе переменные имеют одинаковые значения.
Некоторый набор цветов (в количестве m штук), называемый палитрой или colormap, можно оформить в виде матрицы размером m x 3 типа double. Например, матрица map1
map1(1,1) = 0.12; map1(1,2) = 0.123; map1(1,3) = 0.987;
map1(2,1) = 0.456; map1(2,2) = 0.7; map1(2,3) = 0.22;
map1(3,1) = 0.88; map1(3,2) = 0.19; map1(3,3) = 0.611;
map1(4,1) = 0.255; map1(4,2) = 0.298; map1(4,3) = 0.128;
map1(5,1) = 0.01; map1(5,2) = 0.78; map1(5,3) = 0.60;
задаёт набор из пяти цветов. Каждая строка соответствует одному цвету. Элементы строки (слева - направо) задают красную, зелёную и синию составляющие цвета.
Далее сформируем матрицу k x L типа uint8, каждый элемент которой будет равен одному из номеров (минус единица) строк таблицы цветов map1. Такой матрицы вместе с матрицей цветов будет достаточно, чтобы показать на экране компьютера массив пикселов, то есть произвольное изображение.
Например, матрица X1
X1=uint8([ 1 4 1 3 2; 4 0 2 1 3 ])
задаёт массив типа uint8 размером 2 x 5 пиксел. Этот массив всего занимает в памяти 10 байт, а не 80 байт, как было бы в случае массива типа double. Первый пиксел в первом ряду имеет цвет, задаваемый второй строкой матрицы map1, второй пиксел в этом же ряду соответствует пятой строке матрицы map1, и так далее.
Чтобы заставить систему MATLAB реально отобразить произвольную картину пикселов, нужно вызвать функцию image.
Например, с помощью функций
image(X1); colormap(map1);
создаётся графический объект Image системы MATLAB, которому в графическом окне MATLABа соответствует реальное изображение:
Поскольку мы не управляем размером графического окна системы MATLAB, то оно появляется на экране с некоторым разумным размером, заданным по умолчанию. Далее, так как наше изображение состоит из двух рядов по пять пиксел в каждом, а это очень мелкое изображение (физический размер пиксела экрана примерно равен 0.2 мм), то MATLAB по умолчанию масштабирует его (увеличивает), чтобы можно было разглядеть это изображение. Если требуется отменить такое масштабирование, то следует указать явно нужные размеры:
[ m, n ] = size(X1);
figure('Units', 'pixels', 'Position', [100 100 n m]);
image(X1); colormap(map1);
Здесь размеры m и n изображения X1 навязываются в качестве физического размера картинки в графическом окне системы MATLAB. Для слишком маленьких картинок при этом ничего хорошего не получится.
Если мы не будем создавать новые изображения, манипулируя явно матрицами, а будем пытаться отобразить в графическом окне системы MATLAB уже готовые картинки, записанные в файлах, то тогда нам потребуется прочесть содержимое этих файлов функцией imread. В частности, ранее мы записывали трёхмерные изображения в файлы с помощью функции imwrite. Теперь их можно прочесть
[ X2, map2 ] = imread('myfile1.jpg')
и показать в графическом окне. Заметим только, что файл должен быть в текущем каталоге системы MATLAB, иначе его нужно указать вместе с полным путём к нему.
Рассмотренное нами строение данных для объекта Image, состоящее из двух матриц, одна из которых построчно задаёт цвета, а вторая своими элементами указывает входы в таблицу (матрицу) цветов, называется более точно как Indexed Image (индексированное изображение). Есть и другой тип объекта Image - так называемый Truecolor Image (картинки с очень большим количеством цветов - до 16 миллионов). Этот второй тип объектов Image устроен по-другому.
Для TruecolorImage- объектов таблица цветов не требуется, так как массивы данных таких объектов непосредственно определяют цвета.
Эти массивы имеют размер m x n x 3 (это массивы размерности 3). Величины m и n определяют размер картинки на экране (m x n пикселов), а вдоль третьего направления располагаются RGB-составляющие цвета каждого пиксела. Зададим для примера следующий массив для изображения TrueColor:
xTrue(1,1,1) = uint8(127); xTrue(1,1,2) = uint8(127); xTrue(1,1,3) = uint8(127);
xTrue(1,2,1) = uint8(19); xTrue(1,2,2) = uint8(12); xTrue(1,2,3) = uint8(255);
xTrue(1,3,1) = uint8(245); xTrue(1,3,2) = uint8(127); xTrue(1,3,3) = uint8(1);
xTrue(2,1,1) = uint8(6); xTrue(2,1,2) = uint8(203); xTrue(2,1,3) = uint8(128);
xTrue(2,2,1) = uint8(100); xTrue(2,2,2) = uint8(1); xTrue(2,2,3) = uint8(80);
xTrue(2,3,1) = uint8(60); xTrue(2,3,2) = uint8(249); xTrue(2,3,3) = uint8(5);
Массив xTrue создаёт изображение 2 x 3 пиксела с помощью вызова одной функции image(xTrue):
Если изображение находится в файле и вы заранее не знаете какой оно имеет тип (индексное, то есть с палитрой цветов, или имеет тип TrueColor), то можете читать его следующим образом:
[ X, map ] = imread('name.xxx')
В случае TrueColor изображений здесь матрица X получит размер m x n x 3 а матрица палитры map будет пустой:
size(map) = 0 0
В дальнейшем функция image автоматически по размеру матрицы X распознаёт типы изображений и действует в обоих случаях как надо, а функция colormap в случае пустого массива map не делает ничего, так что оба этих случая могут быть обработаны одинаково.
Однако, если бы мы заранее знали, что в файле содержится изображение типа TrueColor, то мы бы выполняли для его чтения более короткий код
X = imread('name.xxx')
а показывали бы изображение вызовом только одной функции image(X). Чтобы заранее узнать тип изображения в файле, нужно вызвать функцию
Дата добавления: 2015-01-18 | Просмотры: 708 | Нарушение авторских прав
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 |
|