画像内で最もよく使用される色、または少なくとも主要な色調を抽出したいのですが、このタスクを開始する方法を教えてください。または同様のコードを教えてください。私はそれを探していましたが、成功しませんでした。
3 に答える
Octree Color Quantizationアルゴリズムを使用すると、非常に良い結果を得ることができます。他の量子化アルゴリズムはウィキペディアで見つけることができます。
私はコメントに同意します-プログラミングソリューションは間違いなくより多くの情報を必要とするでしょう。ただし、それまでは、画像内の各ピクセルのRGB値を取得すると仮定して、色相が各ピクセルの「トーン」を表すと言えるHSV色空間を検討する必要があります。次に、ヒストグラムを使用して、画像で最も使用されているトーンを識別できます。
さて、私はあなたが各ピクセルのRGBカラーにアクセスできると思います。あなたがそれを望む方法に応じてあなたがそうすることができる2つの方法があります。
まず、すべてのピクセルのR、G、Bの一部を作成するだけです。このように。
擬似コード。
int Red = 0;
int Green = 0;
int Blue = 0;
foreach (Pixels as aPixel) {
Red += aPixel.getRed();
Green += aPixel.getGreen();
Blue += aPixel.getBlue();
}
次に、どちらが多いかを確認します。
これにより、画像だけがより赤、緑、または青になります。
別の方法では、各RGBの組み合わせのヒストグラムを作成するだけで、組み合わせた色(オレンジなど)の静的な色も得られます。
擬似コード。
Map ColorCounts = new();
foreach (Pixels as aPixel) {
const aRGB = aPixel.getRGB();
var aCount = ColorCounts.get(aRGB);
aCount++;
ColorCounts.put(aRGB, aCount);
}
次に、どちらがより多くのカウントを持っているかを確認します。通常のRGBカラーリングでは最大670万色になるため、色解像度を下げることもできます。
これは、RGBを色の範囲に指定することで簡単に実行できます。たとえば、RGBは256ではなく8ステップです。
擬似コード。
function Reduce(Color) {
return (Color/32)*32; // 32 is 256/8 as for 8 ranges.
}
function ReduceRGB(RGB) {
return new RGB(Reduce(RGB.getRed()),Reduce(RGB.getGreen() Reduce(RGB.getBlue()));
}
Map ColorCounts = new();
foreach (Pixels as aPixel) {
const aRGB = ReduceRGB(aPixel.getRGB());
var aCount = ColorCounts.get(aRGB);
aCount++;
ColorCounts.put(aRGB, aCount);
}
次に、どの範囲が最もカウントされているかを確認できます。
これらのテクニックがあなたにとって理にかなっていることを願っています。