Я хотел бы создать colormap в matlab. Я хочу угаснуть цвет в соответствии с серым уровнем пикселя.
Например:
from 255 to 160 -> white
from 159 to 120 -> pink
from 119 to 50 -> brown
from 49 to 0 -> dark
Я хотел бы создать colormap в matlab. Я хочу угаснуть цвет в соответствии с серым уровнем пикселя.
Например:
from 255 to 160 -> white
from 159 to 120 -> pink
from 119 to 50 -> brown
from 49 to 0 -> dark
Из docs:
Колонка представляет собой матрицу m-на-3 действительных чисел между 0.0 и 1.0. Каждая строка представляет собой вектор RGB, который определяет один цвет. K-я строка colormap определяет k-й цвет, где map (k,:) = [r (k) g (k) b (k)]) определяет интенсивность красного, зеленого и синего.
Итак, чтобы начать, мы создадим матрицу m-by-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;
Теперь теперь можно использовать brown вместо красного цвета, чтобы получить тройку из этой ссылки, разделив каждый компонент цвета на 255, чтобы наша тройка была t = [101, 67, 33]./255
. Итак, теперь просто повторите процедуру linspace для каждого цвета:
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)
В качестве альтернативы вы можете использовать функцию AdvancedColormap
из FEX.
Если вам нужна плавная цветовая палитра, вы можете сделать это следующим образом:
map = AdvancedColormap('kbpw',256,[0 50 120 255]/255);