web-dev-qa-db-ja.com

画像の主要な色をすばやく取得する方法

画像(写真)の主要な色を取得する方法について質問があります。私はこのアルゴリズムを考えました:すべてのピクセルをループして、赤、緑、黄色、オレンジ、青、マゼンタ、シアン、白、グレーまたは黒のいずれかの色を取得します(もちろんある程度のマージンがあります)通常)、その後、どの色が最も多く発生したかを確認します。これは遅く、あまり正確ではないと思います。もっと良い方法はありますか?


重要な場合は、最大5 MpxのiPhoneまたはiPod touchカメラから取得したUIImageです。高速でなければならない理由は、進行状況インジケーターを表示するだけではあまり意味がないからです。これは、視力の悪い、またはまったく視力のない人向けのアプリのためです。モバイルデバイス用であるため、あまりメモリを使用しない場合があります(最大50 MB)。

34
user142019

あなたの一般的なアプローチはうまくいくはずですが、私はいくつかの詳細を強調したいと思います。

与えられた色のリストの代わりに、ピクセルを数えるために、色のスペクトルでいくつかの色の「ビン」を生成します。そのためのいくつかのアルゴリズムがある別の質問を次に示します: スペクトルカラーパレットの生成 .

次に、検討している各ピクセルについて、増分する「最も近い」カラービンを見つける必要があります。 「最近接」を定義する必要があります。 「色差」に関するこの記事を参照してください: http://en.wikipedia.org/wiki/Color_difference

パフォーマンスのために、すべてのピクセルを見る必要はありません。通常、画像要素は広い領域(空、草など)をカバーするため、数ピクセルをサンプリングするだけで目的の結果を得ることができます。 10ピクセルごと、または100ピクセルごとにサンプリングしても良い結果が得られると思います。あなたもその要因で実験することができます。

[編集者注:以下の段落は、Mike Fairhurstのコメントに対応するために編集されました。]

このデモのように、ピクセルの平均化も実行できます:jsfiddle.net/MUsT8/

30
payne