Как создать собственную цветовую карту программно?

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

Например:

from 255 to 160 -> white 
from 159 to 120 -> pink
from 119 to 50 -> brown
from 49 to 0 -> dark
 ispanico21 июн. 2013 г., 11:14
 Я хотел бы сделать то же самое с colormapeditor, но я хочу написать функцию Matlab. В этом случае ям может изменить вручную пороги для цветов в соответствии с изображением ям с помощью. Извините за мой английский!
 Dan21 июн. 2013 г., 10:53
Попробуйте colormapeditor:mathworks.com/help/matlab/ref/colormapeditor.htmlI»

Ответы на вопрос(2)

Решение Вопроса

документы:

Цветовая карта - это матрица размером 3 на 3 из вещественных чисел от 0,0 до 1,0. Каждая строка представляет собой вектор RGB, который определяет один цвет. K-я строка цветовой карты определяет k-й цвет, где map (k, :) = [r (k) g (k) b (k)]) определяет интенсивность красного, зеленого и синего цветов.

Итак, для начала мы собираемся создать матрицу размером 3 на 3, в вашем случае m равно 161:

m = 161;
map = zeros(m , 3);

Теперь вы хотите, чтобы дно было темным (ям идет с черным) а 50-й пункт будет коричневым. но давайте с красным в качестве примера, как этопроще RGB утраивается для черного и красного соответственно:[0,0,0] а также[1,0,0]

Итак, в настоящее время наша цветовая карта enitre черная. Мы знаем, что хотимmap(50,:) = [1, 0 ,0] то есть красный, но теперь мы хотим градиент между ними, верно? Итак, давайте использоватьLINSPACE для этого (обратите внимание, что есть лучший метод, использующийinterp1 вместоlinspace в конце этого ответа):

R0to50 = linspace(0,1,50)';

положить это на карте:

map(1:50, 1) = R0to50;

Итак, теперь давайте использоватькоричневый вместо красного, чтобы получить тройку из этой ссылки, разделите каждый компонент цвета на 255, чтобы наша тройкаt = [101, 67, 33]./255, Хорошо, теперь просто повторите эту процедуру для каждого цвета:

R = linspace(0,t(1),50);
G = linspace(0,t(2),50);
B = linspace(0,t(3),50);

T = [R', G', B'];

map(1:50, :) = T;

А теперь повторите для каждого из ваших других узлов.

Например:

I = linspace(0,1,161);
imagesc(I(:, ones(10)))
colormap(map)

Альтернатива использованиюlinspace один раз на канал по отдельности и повторяя это для каждого цвета, использовать линейную интерполяцию.

Создайте матрицу, в которой каждая строка представляет собой цветовую тройку

T = [0,   0,   0          %// dark
     101, 67,  33         %// brown
     255, 105, 180        %// pink
     255, 255, 255        %// white
     255, 255, 255]./255; %// white again  -> note that this means values between 161 and 255 will be indistinguishable

А теперь создайте вектор, в каком диапазоне должен находиться каждый цвет (то есть этот вектор определяет интервал между цветами, они не должны быть равномерно / равномерно разнесены):

x = [0
     50
     120
     160
     255];

И, наконец, вы можете создать всю карту с помощью одной простой интерполяции:

map = interp1(x/255,T,linspace(0,1,255));

тестирование

I = linspace(0,1,255);
imagesc(I(ones(1,10),:)')
colormap(map)

 Dan21 июн. 2013 г., 13:48
Вы должны быть в состоянии решить это на основе ответа выше. Но вместоmap(1:50... вы'буду использоватьmap(51:120... и вместоlinspace(0,t(1),50) вы'буду идтиlinspace(t(1), t_pink(1), 70) так далее
 ispanico21 июн. 2013 г., 13:15
Спасибо, очень, очень полезно ... но другой вопрос ... если я хочу, чтобы коричневый цвет стал розовым?
 ispanico21 июн. 2013 г., 14:15
Я не'читаю твой ответ, но ямы сделали это Работает отлично! Большое спасибо за вашу помощь
 Some Guy31 дек. 2015 г., 15:46
Создание карты с использованиемinterp1 умный!

В качестве альтернативы вы можете использоватьAdvancedColormap функция отFEX, Если вам нужна гладкая цветовая карта, вы можете сделать это так:

map = AdvancedColormap('kbpw',256,[0 50 120 255]/255);

Ваш ответ на вопрос