Проблема
Существует one-to-one mapping из индексированных цветов в parula
палитрой к RGB троек. Однако такого взаимно однозначного сопоставления не существует, чтобы отменить этот процесс, чтобы преобразовать индексированный цвет parula
в RGB (действительно, существует бесконечное число способов сделать это). Таким образом, между двумя пространствами нет взаимно однозначного соответствия или . Ниже приведен график, который показывает значения R, G и B для каждого индекса parula
, что делает это более ясным.
Это место для большинства индексированных цветов. Любое решение этой проблемы будет не уникальным.
A Встроенный в растворе
я после того, как играл с этим немного, я понял, что уже есть встроенная функция, которая может быть достаточно: rgb2ind
, который преобразует данные изображения RGB в индексированные данные изображения. Эта функция использует dither
(которая, в свою очередь, вызывает функцию mex ditherc
), чтобы выполнить преобразование инверсной цветовой карты.
Вот доказательство того, что использует сжатие JPEG, чтобы добавить шум и искажение цвета в исходных данных parula
индекса:
img0 = peaks(32); % Generate sample data
img0 = img0-min(img0(:));
img0 = floor(255*img0./max(img0(:))); % Convert to 0-255
fname = [tempname '.jpg']; % Save file in temp directory
map = parula(256); % Parula colormap
imwrite(img0,map,fname,'Quality',50); % Write data to compressed JPEG
img1 = imread(fname); % Read RGB JPEG file data
img2 = rgb2ind(img1,map,'nodither'); % Convert RGB data to parula colormap
figure;
image(img0); % Original indexed data
colormap(map);
axis image;
figure;
image(img1); % RGB JPEG file data
axis image;
figure;
image(img2); % rgb2ind indexed image data
colormap(map);
axis image;
Это должно создавать изображения, похожие на первые три ниже.
Альтернативное решение: Color Difference
Другой способ решения этой задачи, сравнивая разницу между цветами в изображении RGB со значениями RGB, которые соответствуют каждому индексу палитрой , Стандартный способ сделать это - calculating ΔE в цветовом пространстве CIE L*a*b*. Я реализовал эту форму в общей функции rgb2map
, которая может быть downloaded from my GitHub. Этот код основан на makecform
и applycform
в Image Processing Toolbox для преобразования из RGB в 1976 CIE L * a * b *.
Следующий код будет производить изображение как тот, справа вверху:
img3 = rgb2map(img1,map);
figure;
image(img3); % rgb2map indexed image data
colormap(map);
axis image;
Для каждого пикселя RGB в качестве входного изображения, rgb2map
вычисляет разницу в цвете между ней и каждой RGB триплет во входной палитре используя стандарт CIE 1976. Функция min
используется для определения индекса минимума Δ E (если существует более одного минимального значения, возвращается индекс первого). Более сложные средства могут использоваться для выбора «наилучшего» цвета в случае кратных минимумов Δ E, но они будут более дорогостоящими.
Выводы
В качестве последнего примера, я использовал an image of the namesake Parula bird, чтобы сравнить два метода в приведенном ниже рисунке. Два результата для этого изображения совершенно разные. Если вы вручную настроите rgb2map
, чтобы использовать более сложный стандарт цветовой разницы CIE 1994, вы получите еще один рендеринг. Однако для изображений, которые более точно соответствуют исходному parula
colormap (как указано выше), оба должны возвращать более похожие результаты. Важно отметить, что rgb2ind
выигрывает от вызова mex-функций и почти в 100 раз быстрее, чем rgb2map
, несмотря на несколько оптимизаций в моем коде (если используется стандарт CIE 1994, это примерно в 700 раз быстрее).
Наконец, те, кто хочет узнать больше о цветовых картах в Matlab, должны прочитать это four-part MathWorks blog post Стив Eddins на новом parula
палитры.
Обновление 6-20-2015:rgb2map
Код, описанный выше, обновлен для использования различных цветовых преобразований пространства, что улучшает его скорость почти в два раза.
Мне не совсем понятно: хотите ли вы получить массив, который использовался для создания первого изображения (с 'imshow' и параболической парой)? – Ratbert
Да. Я хочу получить данные, которые были использованы для создания первого изображения Parula.Я хочу, чтобы иметь возможность создать первое изображение, прочитав файл обратно в Matlab, а затем снова нарисовать его. –
ОК. Если вы не знаете, что такое настройка 'caxis' (_i.e._ диапазон цветовой схемы), существует неопределенность. Например, синий может быть любым значением, зависящим от этого параметра ... Решение может дать вам массив размером от 0 до 1, например, который может не быть начальным диапазоном данных. – Ratbert