260000 * 3 次元配列に異なる RGB 値があります。これらの色を昇順または降順 (どちらでも構いません) に並べ替えて、類似した色が近くなるようにします。これを行う最も効率的な方法は何ですか?
3 に答える
例:
まず、通常の Jet カラーマップから始めます。
%# sample image mapped to Jet colormap
I = repmat(1:100, 100, 1);
C = jet(100);
figure
subplot(211), imagesc(I), colormap(C)
subplot(212), rgbplot(C)
まず、色をシャッフルします。次に、元の色のグループ化を復元しようとします (これは、色相と値に従ってHSV色空間で並べ替えることによって行います)。
%# shuffle colors
C = C(randperm(100), :);
%# rearrage according to HSV colorspace
C = rgb2hsv(C);
C = sortrows(C, [-1 -3 2]); %# sort first by Hue, then by value
C = hsv2rgb(C);
figure
subplot(211), imagesc(I), colormap(C)
subplot(212), rgbplot(C)
おかしなことに聞こえるsortrows()
かもしれませんが、本質的な機能はおそらく適切です。しかし、あなたの本当の問題は、RGB トリプルを使用して色の近さを定義しようとすることにあります - [255,254,255] は [255,255,0] に「近い」ですか?
PS あなたのコメントの前に、データのテーブルには 260000 行が含まれ、各行には色の RGB コンポーネントを表す 3 つの数値が含まれていると想定していました。つまり、260000 色のテーブルがあったということです。これが正しくない場合は、さらに照らしていただけますか
sort
コマンドは、開始するのに適した場所です。最初の次元、次に 2 番目、3 番目の次元で並べ替えることができるはずです。私は RGB 値にあまり詳しくないので、寸法を個別に並べ替えた結果、一致する色がグループ化されるかどうかは完全にはわかりませんが、上記のプロセスに何らかの適応を行うことでうまくいくはずです。
編集: ソート インデックスを含めると、RGB カラーの分割が回避されます。例:
x=[5,6;4,7;3,8;2,9;1,10];
[x1,index]=sort(x(:,1));
x2=x(index,2);
x=[x1 x2];
sortrows コマンドはおそらくもっと洗練されたものになるでしょうが、私はこれまでそれを知りませんでした。HPM はその理由で権利を有します。