2015-05-01 3 views
9

Между RGB и Parula нет биекции, обсуждаемой here. Я думаю, как хорошо обрабатывать изображения файлов в Parula. Эта проблема была разработана из этого thread об удалении черного цвета с изображений ЭКГ путем расширения корпуса до общей проблемы с цветами Parula.Прогнозировать изображение Parula в Matlab без потери разрешения

данных:

enter image description here

который генерируется

[X,Y,Z] = peaks(25); 
imgParula = surf(X,Y,Z); 
view(2); 
axis off; 

Это не точка этого потока, чтобы использовать этот код в вашем решении, чтобы прочитать второе изображение.

Код:

[imgParula, map, alpha] = imread('http://i.stack.imgur.com/tVMO2.png'); 

где map является [] и alpha является полностью белым изображением. Ведение imshow(imgParula) дает

enter image description here

, где вы видите много помех и потерянное разрешения, поскольку Matlab читает изображения как RGB, хотя фактическая Colormap является Parula. Изменение размера изображения не улучшает разрешение.

Как вы можете прочитать изображение в соответствующей цветовой карте в Matlab? Я не нашел ни одного параметра для указания цветовой карты при чтении.

+0

Мне не совсем понятно: хотите ли вы получить массив, который использовался для создания первого изображения (с 'imshow' и параболической парой)? – Ratbert

+0

Да. Я хочу получить данные, которые были использованы для создания первого изображения Parula.Я хочу, чтобы иметь возможность создать первое изображение, прочитав файл обратно в Matlab, а затем снова нарисовать его. –

+1

ОК. Если вы не знаете, что такое настройка 'caxis' (_i.e._ диапазон цветовой схемы), существует неопределенность. Например, синий может быть любым значением, зависящим от этого параметра ... Решение может дать вам массив размером от 0 до 1, например, который может не быть начальным диапазоном данных. – Ratbert

ответ

9

Проблема

Существует one-to-one mapping из индексированных цветов в parula палитрой к RGB троек. Однако такого взаимно однозначного сопоставления не существует, чтобы отменить этот процесс, чтобы преобразовать индексированный цвет parula в RGB (действительно, существует бесконечное число способов сделать это). Таким образом, между двумя пространствами нет взаимно однозначного соответствия или . Ниже приведен график, который показывает значения R, G и B для каждого индекса parula, что делает это более ясным.

Parula to RGB plot

Это место для большинства индексированных цветов. Любое решение этой проблемы будет не уникальным.


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; 

Это должно создавать изображения, похожие на первые три ниже.

Example original data and converted images


Альтернативное решение: 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 раз быстрее).

RGB image of bird converted using two methods

Наконец, те, кто хочет узнать больше о цветовых картах в Matlab, должны прочитать это four-part MathWorks blog post Стив Eddins на новом parula палитры.

Обновление 6-20-2015:rgb2map Код, описанный выше, обновлен для использования различных цветовых преобразований пространства, что улучшает его скорость почти в два раза.

+0

'rgb2map', кажется, лучше смотреть, чем' rgb2ind' во всех цветах. «rgb2map», похоже, прожег желтым цветом. ** Почему это сжигание происходит в 'rgb2map'? Любой способ избежать этого? ** - Еще одна надежда состоит в том, что если вы можете поддерживать сетку вертикальных и горизонтальных линий в некоторых ваших примерах. Я хотел бы видеть, как разные функции влияют на линии в разных средах. Эти линии особенно сложны для вызова по определенной причине. –

+1

@Masi: Я предполагаю, что это связано с использованием простой функции 'min' для поиска ближайшего совпадения цветов. В крайних точках, то есть вблизи черных, белых и полностью насыщенных цветов, вполне вероятно, что будет несколько минимумов, и в этом случае будет использоваться первый. Это приводит к тому, что многие пиксели отображаются как одно из экстремальных значений в цветовой палитре. Потенциальные способы: 1) изменить порядок цветовой схемы, чтобы всегда был выбран другой цвет, 2) случайным образом выбирать (или другую схему), когда присутствуют несколько минимумов, 3) использовать взвешивание для смещения определенных каналов или их комбинаций для изменения выбора. – horchler

+1

Цветовая палитра 'parula' не включает черный и белый. Ваши изображения выглядят как захват экрана и имеют черные линии, несмотря на использование индексированных цветов, потому что вы просматриваете данные не как изображение, а как трехмерный объект с помощью 'surf' (черный цвет по умолчанию является крайним, независимо от данных) , Для этого потребуется совершенно другой процесс или специальные случаи. Возможно, было бы лучше избежать проблемы в первую очередь путем предварительной обработки и сохранения файлов по-разному. – horchler

Смежные вопросы