Компьютерная графика / Lab3_Preobr_yarkosti
.pdfЛабораторная работа № 3. ПРЕОБРАЗОВАНИЕ ЯРКОСТИ ГРАФИЧЕСКИХ ИЗОБРАЖЕНИЙ
Цель лабораторной работы – исследование свойств графических изображений и методов поэлементного преобразования монохромных изображений в среде системы MATLAB.
1 КОМПЬЮТЕРНОЕ ПРЕДСТАВЛЕНИЕ ИЗОБРАЖЕНИЙ
1.1Типы графических изображений
Всистеме MATLAB поддерживаются изображения следующих типов:
-полутоновые (grayscale, intensity),
-бинарные (binary),
-палитровые (palette),
-полноцветные (TrueColor, HighColor, RGB).
Полутоновые изображения представлены двумерными матрицами, индексы которых задают положение пиксела на экране, а значения элементов матрицы указывают на уровень яркости пикселов, т.е. оттенок серого цвета.
Бинарные – представлены двумя цветами, белым и черным. Таким образом, элементы матрицы могут иметь одно из двух значений 0 или 1, на представление которых отводится по одному байту. Особенность бинарных изображений состоит в том, что они являются логическими массивами, т.е. массив элементов 0 и 1 не логического типа, например, целого, двоичным изображением не считается. Для преобразования числовых массивов в логические используется команда logical. Преобразование любых числовых данных в логический массив предполагает замену всех ненулевых элементов входного массива логическими единицами и логическими нулями – всех нулевых элементов. Логические массивы могут быть получены также в результате выполнения операций сравнения. Для проверки того, является ли массив логическим, используется команда islogical.
В цветных палитровых изображениях используются две матрицы (рис.1). Одна из матриц содержит значения индексов, которые указывают на строку матрицы палитр.
2(23) Преобразование яркости графических и зображений
Матрица палитр, называемая цве-
товой картой, содержит три столбца (R - красный, G - зеле-
ный, B - синий), значения в кото-
рых указывают на цвет соответ-
ствующего пиксела, а количество строк равно числу различных цветов в изображении.
Рис.1 Матрицы палитрового изображения
Цветовая карта может быть задана командой:
map(k, :) = [r(k) g(k) b(k)];
где r(k), g(k), b(k) – значения RGB, сопоставленные строке k.
В командах допускается использовать также название цвета и его обозна-
чение. Например, установить голубым цвет фона изображения можно любой из команд:
whitebg(‘c’);
whitebg(‘cyan’); whitebg([0 1 1]);
Значения некоторых основных цветов и их обозначений указаны в таблице:
Цвет |
|
Обозначение |
Значение RGB |
|
Черный |
|
Black |
k |
[0 0 0] |
Синий |
|
Blue |
b |
[0 0 1] |
Зеленый |
|
Green |
g |
[0 1 0] |
Голубой |
|
Cyan |
c |
[0 1 1] |
Красный |
|
Red |
r |
[1 0 0] |
Пурпурный |
|
Magenta |
m |
[1 0 1] |
Желтый |
|
Yellow |
y |
[1 1 0] |
Белый |
|
White |
w |
[1 1 1] |
Для указания цветов, не представленных в таблице, используются дробные чис-
ла. Например, серый цвет – [0.5 0.5 0.5], темно-красный – [0.5 0 0], аквамарино-
вый – [0.49 1 0.83].
В MATLAB имеется несколько стандартных цветовых карт, которые можно загрузить командой colormap(map_name), где map_name - наименование цветовой карты. Например, colormap(copper). Наименования карт: au-
tumn, bone, colorcube, cool, copper, flag, gray, hot, hsv, jet, lines, pink, prism,
Преобразование яркости графических изображений |
3(23) |
spring, summer, white, winter. Кроме того, изображение с необходимой картой можно непосредственно вывести командой imshow(X, copper). Длину карт
(количество цветов) можно ограничить, указав в круглых скобках соответствующее число, например gray(16).
Полноцветные изображения имеют формат RGB и хранятся в трехмер-
ном массиве, содержащем три матрицы (рис.2).
Элемент массива M(l,r,n) содержит сведения о номере строки l, столбца r,
задающих положение пиксела, и номер матрицы n, который может принимать значения: 1 - для R-матрицы, 2 - для G-матрицы и 3 – для B-матрицы.
Каждая из матриц содержит индек-
сированные переменные со значе-
нием, соответствующим относи-
тельной яркости красного, зеленого и синего цветов.
Рис.2 Цветовые матрицы массива RGB
Извлечь из общего цветного изображения отдельные цветовые слои мож-
но командами (рис.3):
fR=imageRGB(:, :, 1); fG=imageRGB(:, :, 2); fB=imageRGB(:, :, 3);
а) RGB |
б) слой R |
в) слой G |
г) слой B |
Рис.3 Пример выделения отдельных слоев из изображения RGB
4(23) |
Преобразование яркости графических и зображений |
При воспроизведении RGB изображения, например, на экране монитора,
каждый слой активирует соответствующий цветной фильтр. Согласно яркости
(интенсивности) пикселей каждого слоя формируются три изображения в тонах красного, зеленого и синего, объединение которых представляет собой цветное изображение.
Создать цветное изображение из отдельных слоев можно командой:
imageRGB=cat(3, fR, fG, fB);
В общем случае оператор cat(dim, A1, A2, …) связывает матрицы вдоль раз-
мерности, указанной переменной dim. При dim=1 матрицы располагаются по
вертикали, при dim=2 – по горизонтали, при dim =3 – по третьему направле-
нию, т.е. вглубь, что соответствует компоновке массива в формате RGB.
Система MATLAB не устанавливает ограничений на число размерностей массивов. Функция ndims возвращает размер массива, например
n=ndims(A);
Эта функция всегда имеет значения не меньше, чем 2, т.к. считается, что даже скаляры имеют размерность 2.
Количество возможных цветов в общей палитре RGB равно
2r 2g 2b 2 r g b , где r, g, b – разрядности каждой цветной компоненты. При r=g=b=8 изображение имеет глубину 24 бита, а количество цветов равно 224, т.е. 16.7 миллиона (TrueColor). Кроме того, часто используются цветные изображе-
ния, имеющие 16, 256 или 65536 (HighColor) цветов.
1.2 Типы данных их преобразование
Системой MATLAB поддерживаются следующие типы данных: double, single - вещественные, int8, int16, int32 – целые со знаком, uint8, uint16, uint32 –
целые без знака, char – символьные, logical – бинарные. Например, если элемен-
ты полутонового изображения принадлежат классу uint8 или uint16, то они представлены целыми числами в интервалах [0, 255] и [0, 65535] соответствен-
но. Если изображение класса double, то его пикселы являются вещественными числами с плавающей запятой и должны иметь значения в интервале [0, 1].
Конвертировать данные из одного типа в другой можно командами, одно-
Преобразование яркости графических изображений |
5(23) |
именными с названием типа данных. Например, преобразовать массив в тип uint8 можно командой a=uint(b), где a и b – преобразованный и исходный мас-
сивы. Если при этом массив типа double имеет элементы со значениями вне ин-
тервала [0, 255] и дробные числа, то система MATLAB преобразует все отрица-
тельные величины в 0, большие 255 – в 255, а у всех остальных элементов от-
брасывается дробная часть. Таким образом, перед конвертированием необходи-
мо выполнить перемасштабирование элементов изображения, для чего в систе-
ме MATLAB имеются специальные функции:
im2uint8 - выполняет все необходимые преобразования с предварительным анализом типа входных данных. Функция im2uint8 обнуляет все отрица-
тельные значения входного изображения, устанавливает число 255 на место ве-
личин, больших 1, и умножает остальные значения на 255, после чего округляет результат до ближайшего целого числа. Например, преобразование изображе-
ния b размером 2х2 класса double, имеющего значения
-0.5 0.5 0.75 1.5
командой a=im2uint8(b) сформирует результат
0 128
191255
im2uint16 - выполняет аналогичные действия.
mat2gray - преобразует произвольные массивы double в нормирован-
ные массивы double со значениями в интервале [0,1]:
A=mat2gray(B, [Bmin Bmax]);
Все элементы, меньшие Bmin, обнуляются, а все элементы, большие Bmax -
заменяются единицами. При выполнении команды
A=mat2gray(B);
в качестве значений Bmin и Bmax принимаются минимум и максимум исходно-
го массива.
im2double - преобразует входной массив в тип double. Если входной массив типа logical, uint8, uint16, то выходной – тип double в диапазоне [0,1].
Если входной массив типа double, то массив не изменяется. Например,
6(23) |
Преобразование яркости графических и зображений |
H=uint8([25 50; 128 200]); HD=im2double(H)
HD =
0.0980 0.1961
0.5020 0.7843
т.е. входной массив преобразован делением каждого элемента на 255. Массив типа uint16 будет делиться на 65535.
im2bw - преобразует входной массив в логический тип. Например, ко-
манда
PB=im2bw(P, T)
порождает двоичное изображение PB из полутонового изображения P, исполь-
зуя порог преобразования T. Значения всех элементов исходного изображения,
меньшие T, заменяются логическими нулями, а все остальные – логическими единицами. Значение порога должно находиться в интервале [0,1] независимо от типа входного изображения. Выходной массив автоматически конвертирует-
ся в логический. При выполнении команды
PB=im2bw(P)
по умолчанию T=0.5.
Если входное изображение типа uint8 или uint16 то функция im2bw вна-
чале делит его на 255 или 65535, соответственно, а затем учитывает порог пре-
образования. Если входное изображение типа double, то функция im2bw сразу применяет порог. При входном логическом массиве выходной - идентичен.
Например, изображение
f=[1 |
2; 3 4] |
f = |
|
1 |
2 |
3 |
4 |
типа double преобразуется следующей командой в двоичное так, что величины не более 2 заменяются нулями, а все остальные – единицами:
gbd=im2double(im2bw(mat2gray(f),0.6)) gbd =
00
11
Эту операцию также можно выполнить командой gbd=double(f>2).
Преобразование яркости графических изображений |
7(23) |
1.3 Конвертирование изображений
Система MATLAB поддерживает взаимное конвертирование изображений различных типов при помощи следующих функций:
dither – функция диффузионного псевдосмешения цветов:
-XD = dither(imageRGB, map, Qm, Qe) - формирование палитрового изоб-
ражения из RGB методом диффузионного псевдосмешения цветов с использо-
ванием палитры map. Параметр Qm задает число битов каждой из цветовых со-
ставляющих, а Qe - погрешность (разность между действительным значением цвета и его ближайшим представлением в палитре). При отсутствии параметров
Qm и Qe используются их значения по умолчанию.
- BW = dither(imagegray) – преобразование полутонового изображения в би-
нарное.
Реализованный функцией dither алгоритм изменяет количество цветов или градаций серого по сравнению исходным изображением перегруппировкой пикселей в локальных областях, причем смешение цветов формирует близкий к необходимому цвет. Улучшение цветового восприятия сопровождается ухуд-
шением разрешающей способности изображения.
gray2ind – преобразование полутонового изображения в палитровое.
Команда
[X, map] = gray2ind(imagegray, n)
формирует палитровое изображение с цветовой картой, содержащей n градаций серого. Если параметр n отсутствует, то по умолчанию n=64.
grayslice – преобразование полутонового изображения в палитровое с отсечением. Команда
X = grayslice(imagegray, n)
формирует палитровое изображение с использованием нескольких порогов яр-
кости. В результате палитра отсутствует. Количество уровней устанавливается параметром n, а их значения равны 1/ n,2 / n,3 / n,..., n 1 / n .
Команда
X = grayslice(imagegray, v)
8(23) |
Преобразование яркости графических и зображений |
формирует палитровое изображение с использованием уровней, заданных век-
тором v и имеющих значения в интервале от 0 до 1.
Сформированные изображения можно показать с помощью функции imshow(X, map) или функции sumimage(X, map) с любой палитрой подходя-
щей длины, т.е. большей, чем количество уровней отсечения.
im2bw – бинаризация отсечением по порогу яркости. Команда
BW = im2bw(imageRGB, n)
формирует бинарное изображение из цветного изображения RGB. Вначале ис-
ходное изображение преобразуется в полутоновое, а затем применяется отсече-
ние по порогу яркости n. Команда
BW = im2bw(X, map, n)
Выполняет аналогичные операции по отношению к палитровому изображению.
ind2gray – преобразование палитрового изображения в полутоновое: imagegray = ind2gray(X, map)
ind2rgb – преобразование палитрового изображения в изображение
RGB, например
imageRGB = ind2rgb(X, map)
mat2gray – преобразование матрицы в полутоновое изображение. В ко-
манде
imagegray = mat2gray(A, [amin amax])
значения конвертируемых в интервал от 0 до 1 элементов матрицы A задаются в пределах от amin до amax. В команде
imagegray = mat2gray(A)
значения пределов устанавливаются по минимальному и максимальному зна-
чениям элементов матрицы A.
rgb2gray – преобразование изображения RGB в полутоновое изображе-
ние, например
imagegray = rgb2gray (imageRGB)
Командой
newmap=rgb2gray(map)
создается палитра яркости на основании исходных R-, G-, B-составляющих ис-
Преобразование яркости графических изображений |
9(23) |
ходной палитры map.
rgb2ind - формирование палитрового изображения. Команда
[X, map] = rgb2ind(imagegray, n, dither_option)
формирует палитровое изображение из полутонового с заданием n количества цветов (длины) карты map. dither_option - опция, имеющая два значения: ‘dither’ (по умолчанию) – с применением псевдосмешения, ‘nodither’ - при котором оттенок исходного изображения конвертируется в ближайший цвет новой карты
(зависящий от значения n), т.е. без псевдосмешения.
Следующая команда создает палитровое изображение из полноцветного:
[X, map] = rgb2ind(imageRGB, n).
Команда
X = rgb2ind(imageRGB, map)
формирует палитровое изображение из полноцветного с использованием цвето-
вой карты map.
2 ФУНКЦИИ РАБОТЫ С ГРАФИЧЕСКИМИ ФАЙЛАМИ
2.1 Считывание графических файлов
Для считывания графических файлов используется функция imread, кото-
рая может быть использована следующим образом:
y = imread('filename');
Здесь filename - имя графического файла. В имя файла необходимо включить полный путь, за исключением тех случаев, когда файл находится в текущем ка-
талоге или в одном из каталогов, входящих в список поиска MATLAB. В ре-
зультате в переменную y заносится содержимое файла в виде матрицы.
Определить размер матрицы можно функцией size. Например:
size (y)
ans = 220 328
Первое число указывает на число строк, а второе – число столбцов матри-
цы (если изображение цветное, то матрица многомерная и присутствует третье число, указывающее на количество слоев, т.е. мерность матрицы).
Функцию size допустимо использовать с двумя параметрами:
10(23) |
Преобразование яркости графических и зображений |
[L, M] = size (y)
В таком случае переменной L присваивается число строк изображения, а пере-
менной M - число столбцов.
Функция whos сообщает дополнительную информацию о массиве:
whos y |
|
|
|
Name |
Size |
Bytes |
Class |
y |
220x328 |
72160 |
uint8 array |
Grand total is 72160 elements using 72160 bytes
Для массива цветного изображения:
whos z |
|
|
|
Name |
Size |
Bytes |
Class |
z |
220x328x3 |
216480 |
uint8 array |
Grand total is 216480 elements using 216480 bytes
2.2 Вывод изображений на экран
На экран монитора изображение можно вывести функцией imshow:
- imshow (y, n) – команда выводит на экран монитора полутоновое изобра-
жение, заданное матрицей y, с использованием n уровней яркости (уровней се-
рого), по умолчанию - 256 уровней.
- imshow (y, [low high]) – команда задает операцию, при которой все пик-
селы со значением не более числа low отображаются черными, а все пикселы со значением не меньше числа high – белыми. Все промежуточные значения пока-
зываются с яркостью, количество уровней которой принято по умолчанию.
- imshow (y, [ ]) – команда выводит изображение в предположении, что пе-
ременной low присвоено минимальное значение массива y, а переменной high -
максимальное. Эта команда используется при показе изображений, имеющих узкий динамический диапазон значений.
Функция pixval используется для интерактивного определения значений яркости отдельных пикселов. Курсор, расположенный поверх изображения, пе-
ремещается мышью, а под окном указываются координаты курсора и значение интенсивности в текущей точке (для цветных изображений указываются значе-
ния во всех слоях). При нажатии и удержании клавиши мыши указывается ве-
личина перемещения курсора по изображению.