Уменьшите количество цветов в изображении

В системах с 24-битными цветными отображениями изображения truecolor могут отображать до 16 777 216 (то есть 224) цвета. В системах с более низкими битовыми глубинами экрана изображения truecolor все еще отображаются достаточно хорошо, потому что MATLAB® автоматически использует цветовое приближение и диферирование при необходимости. Цветовое приближение - это процесс, которым программное обеспечение выбирает замещающие цвета в случае, если не удается найти прямые соответствия.

Индексированные изображения, однако, могут вызвать проблемы, если они имеют большое количество цветов. В целом, вы должны ограничить индексированные изображения 256 цветами по следующим причинам:

  • В системах с 8-битным отображением индексированные изображения с более чем 256 цветами должны будут диферироваться или отображаться и, следовательно, могут плохо отображаться.

  • На некоторых платформах цветовые карты не могут превышать 256 записей.

  • Если индексированное изображение имеет более 256 цветов, MATLAB не может хранить данные изображения в uint8 массив, но обычно использует массив классов double вместо этого, делая размер памяти изображения намного больше (каждый пиксель использует 64 бита).

  • Большинство форматов файлов изображений ограничивают индексированные изображения 256 цветами. Если вы пишете индексированное изображение с более чем 256 цветами (использование imwrite) в формат, не поддерживающий более 256 цветов, вы получите ошибку.

Методы уменьшения количества цветов в изображении включают в себя:

Уменьшите цвета изображения Truecolor используя цветное приближение

Чтобы уменьшить количество цветов в изображении, используйте rgb2ind функция. Эта функция преобразует изображение truecolor в индексированное изображение, уменьшая количество цветов в процессе. rgb2ind предоставляет следующие методы для аппроксимации цветов в оригинальное изображение:

  • Квантование (описано в Квантовании)

    • Равномерное квантование

    • Минимальное отклонение квантования

  • Картографическое отображение цветов (описано в Color map Mapping)

Качество получившегося изображения зависит от метода приближения, который вы используете, области значений цветов в вход изображении и от того, используете ли вы дитеринг. Обратите внимание, что различные методы работают лучше для разных изображений. Описание дитеринга и его включение или отключение см. в разделе «Использование дитеринга для уменьшенных цветов».

Квантование

Уменьшение количества цветов в изображении включает квантование. Функция rgb2ind использует квантование как часть его алгоритма сокращения цвета. rgb2ind поддерживает два метода квантования: равномерное квантование и минимальное отклонение квантования.

Важным термином в обсуждениях квантования изображений является цветовой кубик RGB. Цветовой кубик RGB представляет собой трехмерный массив всех цветов, определенных для определенного типа данных. Поскольку изображения RGB в MATLAB могут иметь тип uint8, uint16, или doubleСуществует три возможных определения цветовых кубов. Например, если изображение RGB имеет класс uint8Для каждой цветовой плоскости задано 256 значений (красный, синий и зеленый), а всего их будет 224 (или 16 777 216) цвета, заданные цветовым кубом. Этот цветовой кубик одинаковый для всех uint8 RGB- изображений, независимо от того, какие цвета они на самом деле используют.

The uint8, uint16, и double цветовые кубы все имеют одинаковую область значений цветов. Другими словами, самый яркий красный в uint8 Изображение RGB выглядит так же, как и самое яркое красное в double Изображение RGB. Самое различие, что double Цветовой кубик RGB имеет еще много оттенков красного (и еще много оттенков всех цветов). Следующий рисунок показывает цветовой кубик RGB для uint8 изображение.

RGB Color Cube для изображений 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 когда необходимо уменьшить количество цветов в индексированном изображении. imapprox основана на rgb2ind и использует те же методы приближения. По существу, imapprox первые вызовы ind2rgb для преобразования изображения в формат RGB и вызовов rgb2ind чтобы вернуть новое индексированное изображение с меньшим количеством цветов.

Например, эти команды создают версию trees изображение с 64 цветами, а не оригиналом 128.

load trees
[Y,newmap] = imapprox(X,map,64);
imshow(Y,newmap)

Качество получившегося изображения зависит от метода приближения, который вы используете, области значений цветов в вход изображении и от того, используете ли вы дитеринг. Обратите внимание, что различные методы работают лучше для разных изображений. Описание дитеринга и его включение или отключение см. в разделе «Использование дитеринга для уменьшенных цветов».

Уменьшите цвета, используя Ditering

Когда вы используете rgb2ind или imapprox чтобы уменьшить количество цветов в изображении, полученное изображение может выглядеть уступающим оригиналу, потому что некоторые цвета теряются. rgb2ind и imapprox оба выполняют дитеринг, чтобы увеличить видимое количество цветов в выходном изображении. Дитеринг изменяет цвета пикселей в районе так, чтобы средний цвет в каждом районе аппроксимировал исходный цвет RGB.

Для примера того, как работает дитеринг, рассмотрим изображение, которое содержит ряд тёмно-оранжевых пикселей, для которых нет точного соответствия в палитре. Чтобы создать внешний вид этого оттенка оранжевого цвета, дитеринг выбирает комбинацию цветов из палитры, которая, взятая вместе как шестипиксельная группа, аппроксимирует нужный оттенок оранжевого цвета. На расстоянии пиксели кажутся правильным оттенком, но если вы посмотрите близко на изображение, то увидите смесь других оттенков. Чтобы проиллюстрировать дитеринг, в следующем примере загружается 24-битное изображение truecolor, а затем используется rgb2ind создать индексированное изображение всего с восемью цветами. Первый пример не использует дитеринг, второй - дитеринг.

Чтение изображения и его отображение.

rgb = imread('onion.png'); 
imshow(rgb)

Figure contains an axes. The axes contains an object of type image.

Создайте индексированное изображение с восемью цветами и без диферирования.

[X_no_dither,map] = rgb2ind(rgb,8,'nodither');
imshow(X_no_dither,map)

Figure contains an axes. The axes contains an object of type image.

Создайте индексированное изображение с использованием восьми цветов с диферингом. Заметьте, что диспергированное изображение имеет большее количество видимых цветов, но имеет несколько нечеткий вид. Изображение, полученное без диферирования, имеет меньше видимых цветов, но улучшенное пространственное разрешение по сравнению с диферированным изображением. Один из рисков при снижении цвета без диферирования заключается в том, что новое изображение может содержать ложные контуры.

[X_dither,map] = rgb2ind(rgb,8,'dither');
imshow(X_dither,map)

Figure contains an axes. The axes contains an object of type image.