2013-07-05 2 views
1

У меня есть изображение, такое как ниже, которое я пытаюсь преобразовать в оттенки серого. Тем не менее, я не хочу стандартное преобразование в оттенки серого.Пользовательское преобразование в оттенки серого MATLAB

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

Например: Я хотел бы, чтобы преобразовать изображение ниже в оттенках серого с помощью "реактивного" градиент в

Визит http://b.vimeocdn.com/ts/121/673/121673915_640.jpg

+0

вы можете найти функцию отображения струи в струе.m в вашем каталоге matlab. или введите «edit jet» в окне команд; если у вас есть возможность применить/отредактировать сопоставление. – Cici

ответ

2

фон

Вот algorithm used by Matlab's built-in method rgb2gray():

rgb2gray() преобразует значения RGB в gra yscale значения путем формирования взвешенной суммы R, G и B компоненты:

0,2989 * R + 0,5870 * G + 0,1140 * В

Обратите внимание, что это те же веса, используемые rgb2ntsc функции для вычисления Y-компонента.

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

Решение

Обратное отображение является нелинейным проблемно не существует единого набора RGB весов, которые могут принять вас от цвета обратно в серый цвет. У вас также нет гарантии, что в цветовой карте jet содержатся все цвета, используемые на изображении.

Вот лучшие усилия обходной путь, который отображает цвета до ближайшего цвета в палитре:

%% Define the transformation as a non-uniform 3D interpolation 
resolution = 512; 
cmap = jet(resolution); 
x = cmap(:,1); 
y = cmap(:,2); 
z = cmap(:,3); 
intensity = gray(resolution); 
intensity = intensity(:,1); 
fx = TriScatteredInterp(x,y,z,intensity,'nearest'); 

%% Load our image, then interpolate from RGB to Grayscale intensity 
img = double(imread('image.jpeg'))/255.0; 
imgOut = fx(img(:,:,1),img(:,:,2),img(:,:,3)); 
imshow(imgOut) 

выполнения является функцией разрешения палитрой, разрешение = 512 занимает около минуты, разрешение = 64 занимает около 5 секунд. Это медленно по двум причинам. Во-первых, мы выполняем нелинейный поиск для каждого пикселя (вместо применения линейного преобразования). Во-вторых, интерполяция рассеивается (а не определяется равномерно), что еще больше замедляет работу.

Входной

Input image

Выход с разрешением палитрой = 64

Output with colormap resolution = 64

Выход с разрешением палитрой = 512

Output with colormap resolution = 512