Matlabでカラーマップを作成したいと思います。ピクセルのグレーレベルに応じて色をフェードします。
例えば:
from 255 to 160 -> white
from 159 to 120 -> pink
from 119 to 50 -> brown
from 49 to 0 -> dark
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)
_
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)
_
または、 [〜#〜] fex [〜#〜] のAdvancedColormap
関数を使用できます。スムーズなカラーマップが必要な場合は、次のようにできます。
map = AdvancedColormap('kbpw',256,[0 50 120 255]/255);