[解決済み] Python - 画像中の支配色/最大公約数的な色を見つける
質問
pythonを使用して、画像の中で最も支配的な色/トーンを見つける方法を探しています。平均的な色合いまたはRGBのうち最も一般的なもののいずれかが行われます。私はPython Imagingライブラリを見ましたが、私が彼らのマニュアルで探していたものに関連するものを見つけることができず、またVTKでも簡単に見つけることができました。
しかし、私が必要とするものを行う PHP スクリプトを見つけました。 ここで (ダウンロードにはログインが必要です)。このスクリプトは、画像を150*150にリサイズして、支配的な色を引き出しているようです。しかし、その後、私はかなり失われています。私は、画像を小さなサイズにリサイズして、1ピクセルおきに画像をチェックするようなものを書くことを考えましたが、これは非常に非効率的であると想像します (このアイデアを C python モジュールとして実装することはアイデアかもしれませんが)。
しかし、すべての後に、私はまだ行き詰っています。そこで、私は SO の皆さんに尋ねます。画像内の支配的な色を見つけるための簡単で効率的な方法はないでしょうか。
どのように解決するのですか?
以下は ピロー と Scipyのクラスタパッケージ .
簡単のために、ファイル名を "image.jpg" とハードコードしています。 画像のリサイズは速度のためです。もしあなたが待ち時間を気にしないのであれば、リサイズの呼び出しをコメントアウトしてください。 この 青トウガラシのサンプル画像 を実行すると、通常、支配的な色は#d8c865であると言います。これは2つのピーマンの左下にある明るい黄色がかった領域にほぼ対応します。 私が「通常」と言ったのは、この画像が クラスタリングアルゴリズム を使用しているため、ある程度のランダム性があります。 これを変更する方法はいろいろありますが、あなたの目的にはよく合っているかもしれません。 (決定論的な結果が必要な場合は、kmeans2()の変種のオプションをチェックしてください)。
from __future__ import print_function
import binascii
import struct
from PIL import Image
import numpy as np
import scipy
import scipy.misc
import scipy.cluster
NUM_CLUSTERS = 5
print('reading image')
im = Image.open('image.jpg')
im = im.resize((150, 150)) # optional, to reduce time
ar = np.asarray(im)
shape = ar.shape
ar = ar.reshape(scipy.product(shape[:2]), shape[2]).astype(float)
print('finding clusters')
codes, dist = scipy.cluster.vq.kmeans(ar, NUM_CLUSTERS)
print('cluster centres:\n', codes)
vecs, dist = scipy.cluster.vq.vq(ar, codes) # assign codes
counts, bins = scipy.histogram(vecs, len(codes)) # count occurrences
index_max = scipy.argmax(counts) # find most frequent
peak = codes[index_max]
colour = binascii.hexlify(bytearray(int(c) for c in peak)).decode('ascii')
print('most frequent is %s (#%s)' % (peak, colour))
注:クラスタの数を5から10、15と増やしていくと、緑っぽい、青っぽいという結果が頻繁に出ました。 入力画像からすると、それらも妥当な結果なのですが...。その画像でどの色が本当に優勢なのか私にも分からないので、アルゴリズムのせいにはしません!
また、小さなボーナスとして、最も頻繁に使用されるN色のみを含む縮小された画像を保存します。
# bonus: save image using only the N most common colours
import imageio
c = ar.copy()
for i, code in enumerate(codes):
c[scipy.r_[scipy.where(vecs==i)],:] = code
imageio.imwrite('clusters.png', c.reshape(*shape).astype(np.uint8))
print('saved clustered image')
関連
-
[解決済み] Pythonでディレクトリが存在するかどうかを確認する方法
-
[解決済み] Pythonのsite-packagesディレクトリの場所を見つけるにはどうしたらいいですか?
-
[解決済み] Pythonです。リスト内検索
-
[解決済み] CSSでPNG画像の色を変える?
-
[解決済み】画像処理。コカ・コーラ缶」認識のためのアルゴリズム改良
-
[解決済み】Pythonでディレクトリ内の拡張子.txtのファイルをすべて検索する
-
[解決済み] SQLAlchemy: セッションの作成と再利用
-
[解決済み] Pythonのargparseを使った隠し引数の作成
-
[解決済み] pandasのタイムゾーンに対応したDateTimeIndexを、特定のタイムゾーンに対応したナイーブなタイムスタンプに変換する。
-
[解決済み] Pythonでマルチプロセッシングキューを使うには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Pythonでコード行間にかかる時間を測定するには?
-
[解決済み] pandasのタイムゾーンに対応したDateTimeIndexを、特定のタイムゾーンに対応したナイーブなタイムスタンプに変換する。
-
[解決済み] あるオブジェクトが数であるかどうかを確認する、最もパイソン的な方法は何でしょうか?
-
[解決済み] 異なる順序で同じ要素を持つ2つのJSONオブジェクトを等しく比較するには?
-
[解決済み] CSVデータを処理する際、1行目のデータを無視する方法を教えてください。
-
[解決済み] Pythonによる一対のクロスプロダクト [重複] (英語)
-
[解決済み] Pythonで、ウェブサイトが404か200かを確認するためにurllibをどのように使用しますか?
-
[解決済み] if 節の終了方法
-
[解決済み] Pythonの文字列の前にあるbという接頭辞は何を意味するのですか?
-
[解決済み] djangoのQueryDictをPythonのDictに変更するには?