あなたが私を助けてくれることを願っています。
私はAndroidで写真を撮り、サムネイルを生成し、このサムネイルを使用してピクセルを分析し、最も使用されているトーンを取得しています。
RGBを使うとグループ化が難しいと思ったので、すべてのピクセルカラーをHSVカラーに変えました。ご覧のとおり、私はFloat3を使用しているので、これは、、 is 、equalsと同じhsv.x
です。hsv.h
hsv.y
hsv.s
hsv.z
hsv.v
scores
はint[]
配列であり、各トーンのピクセル数をそこに格納します。このアルゴリズムは、ブルートーン(アクアマリン、ライトブルー、ダークブルー)を見つけるときに非常にうまく機能しますが、モノクロ(黄色のスコアに移動)と暖かい色(オレンジと黄色を「混同」)を認識するのは困難です。また、最後の質問として、茶色(私が見逃したと思う最後の「大きな色」)を認識する方法がわかりません。アルゴリズムは次のとおりです。
for (Float3 hsv: hsvs) {
if(hsv.y < 0.15)
{
if(hsv.z < 0.2)
scores[BLACK]++;
else if(hsv.z < 0.6)
scores[GREY]++;
else
scores[WHITE]++;
}
else if (hsv.x < 15f || hsv.x > 345f)
scores[RED]++;
else if (hsv.x < 40)
scores[ORANGE]++;
else if (hsv.x < 70)
scores[YELLOW]++;
else if (hsv.x < 120)
scores[GREEN]++;
else if (hsv.x < 160)
scores[AQUAMARINE]++;
else if (hsv.x < 200)
scores[LIGHT_BLUE]++;
else if (hsv.x < 240)
scores[DARK_BLUE]++;
else if (hsv.x < 300)
scores[PURPLE]++;
else
scores[PINK]++;
}
いくつかの数値を変更することでアルゴリズムを改善できると思いますか、それとも別のアプローチから始める必要がありますか?
編集:
私はあなたを文脈に入れさせてください。私のアプリは写真を撮り、(実用的な理由で)正方形のサムネイルを取得し、結果の写真を分析します。親指であるため、細部と寸法が失われます(たとえば、200x200pxの親指を作成します)。したがって、私の特定のケースでは、常に40000ピクセルになります。この画像で私がしていることは、最も使用されているトーンをチェックすることです。
最もよく使われるのは、3000ピクセル(画像の約7.5%)以上に現れるトーンとして定義することです。私はそれらをランク付けしません。任意の量の色にちなんで名付けられたいくつかのチェックボックスをチェックするだけです(おそらくあなたに表示される色と茶色になります)。次に、ユーザーは自分が適切と考える色をチェックまたはチェック解除します。実際、Geobitsが指摘しているように、これは人間の問題であり、最もよく使用される色は、最も関連性の高い色を意味するわけではありません。そのため、このツールは完璧である必要はありません。パックにまったく適合しない色の選択に失敗しないようにするためです。