web-dev-qa-db-ja.com

プログラムでカスタムカラーマップを作成する方法は?

Matlabでカラーマップを作成したいと思います。ピクセルのグレーレベルに応じて色をフェードします。

例えば:

from 255 to 160 -> white 
from 159 to 120 -> pink
from 119 to 50 -> brown
from 49 to 0 -> dark
20
ispanico

docs から:

カラーマップは、0.0〜1.0の実数のm行3列の行列です。各行は、1つの色を定義するRGBベクトルです。カラーマップのk番目の行はk番目の色を定義します。map(k、:) = [r(k)g(k) b(k)])は赤、緑の強度を指定します、および青。

では、m行3列の行列を作成します。mは161です。

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

今、あなたは底を暗くして(私は黒で行きます)、50番目のポイントを茶色にしたいです。ただし、例として赤を使用すると簡単です。黒と赤のRGBトリプル:それぞれ_[0,0,0]_と_[1,0,0]_

わかりましたので、現在私たちのエニトレカラーマップは黒です。 map(50,:) = [1, 0 ,0]つまり赤が​​必要なことはわかっていますが、今度はその間にグラデーションが必要ですか?したがって、このために linspace を使用します(この回答の最後にlinspaceの代わりに_interp1_を使用するより良い方法があることに注意してください)。

_R0to50 = linspace(0,1,50)';
_

これをマップに入れます:

_map(1:50, 1) = R0to50;
_

そこで、赤の代わりに brown を使用して、そのリンクからトリプルを取得し、各色成分を255で除算して、トリプルが_t = [101, 67, 33]./255_になるようにします。 OKですので、各色について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)
_

enter image description here


linspaceをチャネルごとに1回ずつ使用し、各色でこれを繰り返す代わりに、線形補間を使用することもできます。

各行がカラートリプルである行列を作成します

_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];
_

最後に、1つの簡単な補間でマップ全体を作成できます。

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

検査

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

enter image description here

23
Dan

または、 [〜#〜] fex [〜#〜]AdvancedColormap関数を使用できます。スムーズなカラーマップが必要な場合は、次のようにできます。

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