1つの可能性は、次のことを行うことだと思います。
色相チャンネルと彩度チャンネルのカラー ヒストグラム
- 塗りつぶされた円の色ヒストグラムを計算します。
- 紙のバーのカラー ヒストグラムを計算します。
- ヒストグラム距離測定を使用して距離を計算します。ここでの可能性には、カイ 2 乗、アースムーバー距離、バッタチャリヤ距離、ヒストグラム交差などが含まれます。
ヒストグラムの計算の詳細については、この opencv リンクを確認してください
ヒストグラム比較の詳細については、この opencv リンクを確認してください
色のヒストグラムを計算するときは、自分で提案したように画像を HSV 色空間に変換することに注意してください。それから、ここで注意すべきことが2つあります。
- [これを必須ではなく提案にするために編集しました。これは、色合いを区別するためにVチャネルが必要になる可能性があるためです。いずれにせよ、両方を試して、より良い結果が得られる方を選択してください。1 つの可能性は、色相と彩度のチャンネルのみを使用することです。つまり、色相と彩度のチャンネルからの値で構成される 3D ヒストグラムではなく、2D ヒストグラムを作成します。そうする理由は、ライティングの変化はVチャンネルで最も感じられるからです。これは、ヒストグラムの使用と合わせて、照明の変化に対する比較をより堅牢にすることを願っています。ここの投稿では、カラー ヒストグラムを作成するときに V チャネルを無視することについていくつかの議論があります。その中の参考文献が役に立つかもしれません。
- opencv 関数を使用してヒストグラムを正規化します。これは、マテリアルのパッチのサイズが異なることを考慮したものです (小さな円と巨大なカラー バーではピクセル数が異なります)。
また、画像の色を「引き伸ばす」ために何らかの前処理を実行することを検討することもできます。たとえば、ヒストグラムの均等化や「S カーブ」マッピングを使用して、色のさまざまな色合いがより適切に分離されるようにします。次に、この処理済みイメージのカラー ヒストグラムを計算します。マッピングの情報を保持し、カラー ヒストグラムを計算する前に新しいテスト サンプルで実行します。
ML を使用した分類
単に距離を計算して最も近いもの (つまり、1 つの最近傍分類子) を取得するだけでなく、分類を行うように分類子をトレーニングすることを検討することもできます。そうする理由の 1 つは、分類子のトレーニングが、トレーニング フェーズ中に色相の異なる色合いにアクセスでき、それらを区別する必要があるため、色相のさまざまな色合いを区別する何らかの方法を学習することを期待しているためです。単に距離を計算する、つまり提案された方法には、このプロパティがない場合があることに注意してください。うまくいけば、これはより良い分類を与えるでしょう。
トレーニングで使用する機能は、前述のカラー ヒストグラムでもかまいません。つまり、トレーニング サンプルについて上記のようにカラー ヒストグラムを計算し、これをクラス (つまり、どの色合いであるか) とともに分類子に渡します。次に、テストサンプルを分類したい場合は、同様に色ヒストグラムを計算して分類器に渡すと、テストサンプルの色が属するクラス (この場合は色の濃淡) が返されます。
あなたが提案したように、単純な距離比較ベースのアプローチを使用するのではなく、分類子をトレーニングする際の潜在的な問題は、プログラムの複雑さが増すことと、トレーニングデータが良くない場合に悪い結果が得られる可能性があることです。また、うまく機能させるためには、多くのパラメーター調整が必要になります。
詳細については、こちらの opencv 機械学習チュートリアルを参照してください。リンクの例では、分類子は 2 つのクラスのみを区別しますが、2 つ以上の色合いがあることに注意してください。通常、分類子は 2 つ以上のクラスで機能するため、これは問題ではありません。
お役に立てれば。