В системах с 24-битными цветными дисплеями трюкколорные изображения могут отображать до 16 777 216 (то есть 224) цветов. В системах с меньшей битовой глубиной экрана изображения с цветным изображением отображаются достаточно хорошо, поскольку MATLAB ® при необходимости автоматически использует цветовую аппроксимацию и дизеринг. Аппроксимация цвета - это процесс, с помощью которого программа выбирает замещающие цвета в случае невозможности найти прямые совпадения.
Индексированные изображения, однако, могут вызвать проблемы, если они имеют большое количество цветов. В общем случае индексированные изображения следует ограничить 256 цветами по следующим причинам:
В системах с 8-битным дисплеем индексированные изображения с более чем 256 цветами должны быть искажены или отображены и, следовательно, могут плохо отображаться.
На некоторых платформах цветовые карты не могут превышать 256 записей.
Если индексированное изображение имеет более 256 цветов, MATLAB не может хранить данные изображения в uint8 массив, но обычно использует массив класса double вместо этого, делая размер памяти изображения намного больше (каждый пиксель использует 64 бита).
Большинство форматов файлов изображений ограничивают индексированные изображения 256 цветами. Если вы пишете индексированное изображение с более чем 256 цветами (с помощью imwrite) в формат, не поддерживающий более 256 цветов, вы получите ошибку.
Способы уменьшения количества цветов в изображении включают в себя:
Уменьшение цветов изображения Truecolor с помощью аппроксимации цвета
Уменьшение цветов индексированного изображения с помощью imapprox
Чтобы уменьшить количество цветов в изображении, используйте rgb2ind функция. Эта функция преобразует цветное изображение в индексированное изображение, уменьшая количество цветов в процессе. rgb2ind предоставляет следующие способы аппроксимации цветов в исходном изображении:
Квантование (описано в разделе Квантование)
Равномерное квантование
Квантование минимальной дисперсии
Сопоставление карты цветов (описано в разделе Сопоставление карты цветов)
Качество получаемого изображения зависит от используемого метода аппроксимации, диапазона цветов во входном изображении, а также от использования дизеринга. Обратите внимание, что различные методы работают лучше для разных изображений. Описание дизеринга и способов его включения и отключения см. в разделе Уменьшение цвета с помощью дизеринга.
Уменьшение количества цветов в изображении включает квантование. Функция rgb2ind использует квантование как часть своего алгоритма уменьшения цвета. rgb2ind поддерживает два метода квантования: равномерное квантование и минимально дисперсионное квантование.
Важным термином в обсуждении квантования изображения является цветовой куб RGB. Цветовой куб RGB представляет собой трехмерный массив всех цветов, определенных для определенного типа данных. Поскольку изображения RGB в MATLAB могут иметь тип uint8, uint16, или doubleсуществует три возможных определения цветового куба. Например, если образ RGB имеет класс uint8, 256 значений определяются для каждой цветовой плоскости (красной, синей и зеленой), и, в общей сложности, будет 224 (или 16 777 216) цвета, определенных цветовым кубом. Этот цветовой куб одинаков для всех uint8 Изображения RGB, независимо от того, какие цвета они на самом деле используют.
uint8, uint16, и double все цветовые кубы имеют одинаковый диапазон цветов. Другими словами, самый яркий красный в uint8 Изображение RGB выглядит так же, как самое яркое красное в double Образ RGB. Разница в том, что double Цветовой куб RGB имеет гораздо больше оттенков красного (и гораздо больше оттенков всех цветов). На следующем рисунке показан цветовой куб RGB для uint8 изображение.
Цветовой куб RGB для изображений uint8

Квантование включает в себя разделение цветового куба RGB на несколько меньших полей, а затем отображение всех цветов, которые попадают в каждое поле, на значение цвета в центре этого поля.
Равномерное квантование и минимально дисперсионное квантование различаются в подходе, используемом для разделения цветового куба RGB. При равномерном квантовании цветной куб разрезается на прямоугольники равного размера (кубики меньшего размера). При минимальном дисперсионном квантовании цветной куб разрезается на прямоугольники (не обязательно кубики) различных размеров; размеры полей зависят от распределения цветов на изображении.
Равномерное квантование. Для выполнения равномерного квантования вызовите rgb2ind и задайте допуск. Допуск определяет размер прямоугольников в форме куба, на которые разделен цветовой куб RGB. Допустимый диапазон для установки допуска составляет [0,1]. Например, если задан допуск 0.1, то рёбра коробок составляют одну десятую длины цветового куба RGB и максимальное общее количество коробок равно
n = (floor(1/tol)+1)^3
Команды, приведенные ниже, выполняют равномерное квантование с допуском 0,1.
RGB = imread('peppers.png');
[x,map] = rgb2ind(RGB, 0.1);Следующий рисунок иллюстрирует равномерное квантование uint8 изображение. Для ясности на рисунке показан двумерный срез (или цветовая плоскость) из цветового куба, где красный = 0 и зеленый и синий находятся в диапазоне от 0 до 255. Фактические значения пикселей обозначаются центрами x.
Равномерное квантование на срезе цветового куба RGB

После разделения цветового куба все пустые ящики выбрасываются. Поэтому для создания цвета для карты цветов используется только один из полей. Как показано ранее, максимальная длина карты цветов, созданной посредством равномерного квантования, может быть предсказана, но карта цветов может быть меньше, чем предсказание, потому что rgb2ind удаляет все цвета, которые не отображаются во входном изображении.
Квантование минимальной дисперсии. Для выполнения квантования минимальной дисперсии вызовите rgb2ind и укажите максимальное количество цветов в цветовой карте выходного изображения. Указанное число определяет количество полей, на которые разделен цветовой куб RGB. Эти команды используют квантование минимальной дисперсии для создания индексированного изображения с 185 цветами.
RGB = imread('peppers.png');
[X,map] = rgb2ind(RGB,185);Квантование минимальной дисперсии работает путем связывания пикселей в группы на основе дисперсии между их значениями пикселей. Например, набор голубых пикселей может быть сгруппирован вместе, поскольку они имеют небольшую дисперсию от центрального пикселя группы.
При квантовании минимальной дисперсии поля, которые делят цветовой куб, изменяются по размеру и не обязательно заполняют цветной куб. Если некоторые области цветового куба не имеют пикселов, в этих областях нет полей.
Пока вы устанавливаете количество полей, n, для использования rgb2ind, размещение определяется алгоритмом при анализе цветовых данных на изображении. После разделения изображения на n оптимально расположенные поля, пиксели в каждом поле отображаются на значение пикселя в центре поля, как при равномерном квантовании.
Результирующая цветовая карта обычно содержит указанное количество записей. Это происходит потому, что цветовой куб разделен так, что каждая область содержит по крайней мере один цвет, который появляется на входном изображении. Если входное изображение использует меньше цветов, чем указанное число, то выходная цветовая карта будет иметь меньше, чем n цвета, и выходное изображение будет содержать все цвета входного изображения.
На следующем рисунке показан тот же самый двумерный срез цветного куба, что и на предыдущем рисунке (демонстрирующий равномерное квантование). Одиннадцать блоков были созданы с использованием квантования минимальной дисперсии.
Квантование минимальной дисперсии на срезе цветового куба RGB

Для заданного числа цветов квантование с минимальной дисперсией дает лучшие результаты, чем равномерное квантование, поскольку оно учитывает фактические данные. Квантование минимальной дисперсии выделяет больше записей карты цветов цветам, которые часто появляются во входном изображении. Оно выделяет меньше записей для цветов, которые появляются нечасто. В результате точность цветов выше, чем при равномерном квантовании. Например, если входное изображение имеет много оттенков зеленого и несколько оттенков красного, на выходной карте цветов будет больше зеленого, чем красного. Следует отметить, что вычисление для квантования с минимальной дисперсией занимает больше времени, чем для равномерного квантования.
Если указать фактическую цветовую карту для использования, rgb2ind использует отображение карты цветов (вместо квантования), чтобы найти цвета в указанной карте цветов, которые лучше всего соответствуют цветам в изображении RGB. Этот метод полезен, если необходимо создать изображения, использующие карту фиксированного цвета. Например, если требуется отобразить несколько индексированных изображений на 8-битном дисплее, можно избежать проблем с цветом, сопоставив их все с одной и той же картой цветов. Отображение карты цветов дает хорошую аппроксимацию, если указанная карта цветов имеет цвета, аналогичные цветам в изображении RGB. Если цветовая карта не имеет цветов, аналогичных цветам в изображении RGB, этот метод приводит к плохим результатам.
В этом примере показано сопоставление двух изображений с одной и той же цветовой картой. Цветовая карта, используемая для двух изображений, создается на лету с помощью функции MATLAB. colorcube, которая создает цветовую карту RGB, содержащую указанное количество цветов. (colorcube всегда создает одну и ту же цветовую карту для заданного количества цветов.) Поскольку цветовая карта включает в себя все цвета во всем цветовом кубе RGB, выходные изображения могут разумно аппроксимировать входные изображения.
RGB1 = imread('autumn.tif'); RGB2 = imread('peppers.png'); X1 = rgb2ind(RGB1,colorcube(128)); X2 = rgb2ind(RGB2,colorcube(128));
Примечание
Функция imshow также полезен для отображения нескольких индексированных изображений. Дополнительные сведения см. в разделе Отображение изображений по отдельности на том же рисунке или на справочной странице для imshow.
Использовать imapprox когда необходимо уменьшить количество цветов в индексированном изображении. imapprox основан на rgb2ind и использует те же методы аппроксимации. По существу, imapprox первые вызовы ind2rgb чтобы преобразовать изображение в формат RGB, а затем вызывает rgb2ind для возврата нового индексированного изображения с меньшим количеством цветов.
Например, эти команды создают версию trees изображение с 64 цветами, а не с исходными 128.
load trees
[Y,newmap] = imapprox(X,map,64);
imshow(Y,newmap)Качество получаемого изображения зависит от используемого метода аппроксимации, диапазона цветов во входном изображении, а также от использования дизеринга. Обратите внимание, что различные методы работают лучше для разных изображений. Описание дизеринга и способов его включения и отключения см. в разделе Уменьшение цвета с помощью дизеринга.
При использовании rgb2ind или imapprox чтобы уменьшить количество цветов в изображении, полученное изображение может выглядеть ниже исходного, поскольку некоторые цвета потеряны. rgb2ind и imapprox оба выполняют дизеринг для увеличения видимого количества цветов в выходном изображении. Дизеринг изменяет цвета пикселей в окрестности так, что средний цвет в каждой окрестности приближается к исходному цвету RGB.
В качестве примера того, как работает дизеринг, рассмотрим изображение, которое содержит ряд темно-оранжевых пикселей, для которых нет точного совпадения в карте цветов. Чтобы создать внешний вид этого оттенка оранжевого, дитеринг выбирает комбинацию цветов из карты цветов, которые, взятые вместе как шестипиксельная группа, аппроксимируют нужный оттенок оранжевого. На некотором расстоянии пикселы выглядят как правильный оттенок, но если посмотреть на изображение близко, можно увидеть сочетание других оттенков. Чтобы проиллюстрировать дизеринг, в следующем примере загружается 24-битное изображение цвета, а затем используется rgb2ind для создания индексированного изображения только с восемью цветами. В первом примере не используется дизеринг, во втором - дизеринг.
Прочтите изображение и выведите его на экран.
rgb = imread('onion.png');
imshow(rgb)
Создание индексированного изображения с восемью цветами и без дизеринга.
[X_no_dither,map] = rgb2ind(rgb,8,'nodither');
imshow(X_no_dither,map)
Создание индексированного изображения с помощью восьми цветов с дизерингом. Обратите внимание, что одурманиваемое изображение имеет большее количество видимых цветов, но несколько нечетко выглядит. Изображение, полученное без дизеринга, имеет меньшее количество видимых цветов, но улучшенное пространственное разрешение по сравнению с дизерированным изображением. Один из рисков, связанных с уменьшением цвета без расслоения, заключается в том, что новое изображение может содержать ложные контуры.
[X_dither,map] = rgb2ind(rgb,8,'dither');
imshow(X_dither,map)