1

Python Imaging Library イメージの平均 RGB 値の計算を 2 つの方法で実装しました。

1 - リストの使用

def getAverageRGB(image):
  """
  Given PIL Image, return average value of color as (r, g, b)
  """
  # no. of pixels in image
  npixels = image.size[0]*image.size[1]
  # get colors as [(cnt1, (r1, g1, b1)), ...]
  cols = image.getcolors(npixels)
  # get [(c1*r1, c1*g1, c1*g2),...]
  sumRGB = [(x[0]*x[1][0], x[0]*x[1][1], x[0]*x[1][2]) for x in cols] 
  # calculate (sum(ci*ri)/np, sum(ci*gi)/np, sum(ci*bi)/np)
  # the zip gives us [(c1*r1, c2*r2, ..), (c1*g1, c1*g2,...)...]
  avg = tuple([sum(x)/npixels for x in zip(*sumRGB)])
  return avg

2 - numpy の使用

def getAverageRGBN(image):
  """
  Given PIL Image, return average value of color as (r, g, b)
  """
  # get image as numpy array
  im = np.array(image)
  # get shape
  w,h,d = im.shape
  # change shape
  im.shape = (w*h, d)
  # get average
  return tuple(np.average(im, axis=0))

#1 が #2 よりも約 20% 高速に実行されることに驚きました。

numpy を正しく使用していますか? 平均計算を実装するより良い方法はありますか?

4

3 に答える 3

2

本当に驚くべきことです。

あなたは使用したいかもしれません:

tuple(im.mean(axis=0))

あなたの平均を計算します(r,g,b)が、それが物事を大幅に改善するとは思えません。getAverageRGBNプロファイリングしてボトルネックを見つけようとしましたか?

于 2012-10-03T08:27:42.487 に答える
0

次元の変更や getAverageRGBN の記述なしのワンライナー:

np.array(image).mean(axis=(0,1))

繰り返しますが、パフォーマンスが向上しない可能性があります。

于 2016-10-04T20:18:19.070 に答える