10

画像の色ヒストグラムを生成しようとしています。私は画像ファイルを読み取るためにPILを使用しており、matplotlibを介して同じものをプロットしようとしています。

im = Image.open(sys.argv[1])  
w, h = im.size  
colors = im.getcolors(w*h)  #Returns a list [(pixel_count, (R, G, B))]

更新:いくつかの試行錯誤の後、このコードはヒストグラムをプロットしますが、色はプロットしません!(320x480 jpegの場合でも、手間がかかり、大量のメモリを消費します)

for idx, c in enumerate(colors):
    plt.bar(idx, c[0], color=hexencode(c[1]))

plt.show()

どこ、

def hexencode(rgb):
    return '#%02x%02x%02x' % rgb

実行時に、プログラムは無限のメモリを消費し始め、表示は提供されません。OSのメモリ使用量は数分で<380MBから>2.5GBになりました。実行を終了した投稿。どうすれば問題を解決できますか?

これは、主な赤の色合いを持つ画像のカラーヒストグラムの例です。

これは、主な赤の色合いを持つ画像のカラーヒストグラムの例です。

4

2 に答える 2

14

私はあなたのアップデートコードを試しました、そしてそれはうまくいきました。これがまさに私が試していることです:

import PIL
from PIL import Image
from matplotlib import pyplot as plt

im = Image.open('./color_gradient.png')  
w, h = im.size  
colors = im.getcolors(w*h)

def hexencode(rgb):
    r=rgb[0]
    g=rgb[1]
    b=rgb[2]
    return '#%02x%02x%02x' % (r,g,b)

for idx, c in enumerate(colors):
    plt.bar(idx, c[0], color=hexencode(c[1]))

plt.show()

アップデート:

matplotlibはすべてのバーの周りに黒い境界線を配置しようとしていると思います。バーが多すぎると、バーが細すぎて色が付きません。ツールバーがある場合は、プロットを拡大して、バーに実際に色が付いていることを確認できます。したがって、エッジの色を次のように設定すると、次のようになります。

for idx, c in enumerate(colors):
     plt.bar(idx, c[0], color=hexencode(c[1]),edgecolor=hexencode(c[1]))

できます!

処理する画像: ここに画像の説明を入力してください

結果: ここに画像の説明を入力してください

tottimeでソートされたプロファイリング:

    ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1   23.424   23.424   24.672   24.672 {built-in method mainloop}
   460645    8.626    0.000    8.626    0.000 {numpy.core.multiarray.array}
    22941    7.909    0.000   18.447    0.001 C:\Python27\lib\site-packages\matplotlib\artist.py:805(get_aliases)
  6814123    3.900    0.000    3.900    0.000 {method 'startswith' of 'str' objects}
    22941    2.244    0.000    2.244    0.000 {dir}
   276714    2.140    0.000    2.140    0.000 C:\Python27\lib\weakref.py:243(__init__)
  4336835    2.029    0.000    2.029    0.000 {getattr}
  1927044    1.962    0.000    3.027    0.000 C:\Python27\lib\site-packages\matplotlib\artist.py:886(is_alias)
   114811    1.852    0.000    3.883    0.000 C:\Python27\lib\site-packages\matplotlib\colors.py:317(to_rgba)
    69559    1.653    0.000    2.841    0.000 C:\Python27\lib\site-packages\matplotlib\path.py:86(__init__)
    68869    1.425    0.000   11.700    0.000 C:\Python27\lib\site-packages\matplotlib\patches.py:533(_update_patch_transform)
   161205    1.316    0.000    1.618    0.000 C:\Python27\lib\site-packages\matplotlib\cbook.py:381(is_string_like)
        1    1.232    1.232    1.232    1.232 {gc.collect}
   344698    1.116    0.000    1.513    0.000 C:\Python27\lib\site-packages\matplotlib\cbook.py:372(iterable)
    22947    1.111    0.000    3.768    0.000 {built-in method draw_path}
   276692    1.024    0.000    3.164    0.000 C:\Python27\lib\site-packages\matplotlib\transforms.py:80(__init__)
        2    1.021    0.510    1.801    0.900 C:\Python27\lib\site-packages\matplotlib\colors.py:355(to_rgba_array)
    22947    0.818    0.000   14.677    0.001 C:\Python27\lib\site-packages\matplotlib\patches.py:371(draw)
183546/183539    0.793    0.000    2.030    0.000 C:\Python27\lib\site-packages\matplotlib\units.py:117(get_converter)
   138006    0.756    0.000    1.267    0.000 C:\Python27\lib\site-packages\matplotlib\transforms.py:126(set_children)

累積時間でソート

ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.001    0.001   84.923   84.923 C:\Python27\test.py:23(imageProcess)
        1    0.013    0.013   44.079   44.079 C:\Python27\lib\site-packages\matplotlib\pyplot.py:2080(bar)
        1    0.286    0.286   43.825   43.825 C:\Python27\lib\site-packages\matplotlib\axes.py:4556(bar)
        1    0.000    0.000   40.533   40.533 C:\Python27\lib\site-packages\matplotlib\pyplot.py:123(show)
        1    0.000    0.000   40.533   40.533 C:\Python27\lib\site-packages\matplotlib\backend_bases.py:69(__call__)
    22943    0.171    0.000   24.964    0.001 C:\Python27\lib\site-packages\matplotlib\patches.py:508(__init__)
        1    0.000    0.000   24.672   24.672 C:\Python27\lib\site-packages\matplotlib\backends\backend_tkagg.py:68(mainloop)
        1    0.000    0.000   24.672   24.672 C:\Python27\lib\lib-tk\Tkinter.py:323(mainloop)
        1   23.424   23.424   24.672   24.672 {built-in method mainloop}
    22947    0.499    0.000   24.654    0.001 C:\Python27\lib\site-packages\matplotlib\patches.py:55(__init__)
    22941    0.492    0.000   20.180    0.001 C:\Python27\lib\site-packages\matplotlib\artist.py:1136(setp)
    22941    0.135    0.000   18.730    0.001 C:\Python27\lib\site-packages\matplotlib\artist.py:788(__init__)
    22941    7.909    0.000   18.447    0.001 C:\Python27\lib\site-packages\matplotlib\artist.py:805(get_aliases)
    72/65    0.071    0.001   17.118    0.263 {built-in method call}
    24/12    0.000    0.000   17.095    1.425 C:\Python27\lib\lib-tk\Tkinter.py:1405(__call__)
    22941    0.188    0.000   16.647    0.001 C:\Python27\lib\site-packages\matplotlib\axes.py:1476(add_patch)
        1    0.000    0.000   15.861   15.861 C:\Python27\lib\site-packages\matplotlib\backends\backend_tkagg.py:429(show)
        1    0.000    0.000   15.861   15.861 C:\Python27\lib\lib-tk\Tkinter.py:909(update)
        1    0.000    0.000   15.846   15.846 C:\Python27\lib\site-packages\matplotlib\backends\backend_tkagg.py:219(resize)
        1    0.000    0.000   15.503   15.503 C:\Python27\lib\site-packages\matplotlib\backends\backend_tkagg.py:238(draw)

すべての時間がmatplotlibで費やされているようです。速度を上げたい場合は、別のプロットツールを見つけるか、「バー」の数を減らすことができます。キャンバス上の長方形を使って自分でやってみてください。

タイミング:

  1. 上記の投稿コード:75秒
  2. それぞれに線を引く、すなわちplt.plot([n、n]、[0、count]、etc ..):95s
于 2012-08-29T17:33:05.520 に答える
12

私は同様の問題に取り組んでいて、5年遅れてこのスレッドに出くわしました。より大きな画像の場合、受け入れられた答えは、単に「画像の色ヒストグラムを生成する」には時間がかかりすぎていました。

ヒストグラムを生成するためにPILの代わりにopenCVを使用しましたが、はるかに高速です。

import cv2
import numpy as np
from matplotlib import pyplot as plt

file0 = 'image.jpg'
img = cv2.imread(file0)
color = ('b','g','r')
plt.figure()
for i,col in enumerate(color):
    histr = cv2.calcHist([img],[i],None,[256],[0,256])
    plt.plot(histr,color = col)
    plt.xlim([0,256])
plt.show()

ここに画像の説明を入力してください

于 2017-11-22T22:00:13.353 に答える