私のアプリケーションでは、高速なアンマネージ コードを使用して複数の画像から RGB ピクセル値を読み取り、それらを HSB カラーに変換します。ここで、次のパーティションを使用して HSB ヒストグラムを作成したいと思います。
- 色相: 18 分割、結果として 0 ~ 360 の 20 間隔
- 彩度: 3 つのパーティション、0...1 から 0.33 の間隔になります。
- 明るさ: 3 つのパーティション、結果として 0...1 から 0.33 の間隔になります
したがって、私のヒストグラムには合計 18*3*3=162 のパーティション (ビン) があり、各チャネルの下の間隔の境界で構成されています。
- ビン1: [0, 0, 0]
- ビン 2: [0, 0, 0.33]
- Bin3: [0, 0, 0.66]
- Bin4: [0, 0.33, 0]
- Bin5: [0, 0.33, 0.33]
- ...
- Bin162: [340, 0.66, 0.66]
各ビンが HSB カラーそのものであると仮定して、これを実装しました。そこで、ビン間隔の境界を計算し、それらの値から HsbColor インスタンスを作成し、色 (HsbHistogramBin クラスにラップ) を単純なリストに入れました。ヒストグラムに新しい HsbColor を追加するときは、次のコードを使用して、インクリメントする必要があるビンを決定します。
private HsbHistogramBin FindBin(HsbColor color)
{
HsbHistogramBin bin = null;
bool foundBin = false;
for (int i = Bins.Count - 1; i >= 0; i--)
{
bin = Bins[i];
if (bin.Color.Hue > color.Hue)
continue;
if (bin.Color.Saturation > color.Saturation)
continue;
if (bin.Color.Brightness > color.Brightness)
continue;
foundBin = true;
break;
}
return foundBin ? bin : null;
}
public void AddColor(HsbColor color)
{
FindBin(color).Value++;
}
明らかに、これは遅すぎます。最悪のシナリオでは、各ピクセルはそのビンを見つけるために 162 回の反復を必要とし、1 つの画像に対して少なくとも数百万回の反復が必要になります。
私の質問は、ピクセルの適切なビンをすぐに見つけることができるように、このデータ構造を高速化するにはどうすればよいですか? 長さ 162 の単純な配列は機能する可能性がありますが、指定されたパーティションにまだ削減されておらず、[259.234、0.5634、0.90534] のような値を含む可能性がある特定のピクセルの正しいビン インデックスを計算するにはどうすればよいですか?