2011-08-05 14 views
6

画像のRGB色の平均値を取得しようとしています。 GDのlibによって 画像のRGB色の平均値

は、私はそれ

$x = imagesx($im); 
    $y = imagesy($im); 
    for ($i = 0;$i < $x;$i++) 
     for ($j = 0;$j < $y;$j++){ 
      $rgb = imagecolorat($im,$i,$j); 
      $sum['R'] += ($rgb >> 16) & 0xFF; 
      $sum['G'] += ($rgb >> 8) & 0xFF; 
      $sum['B'] += $rgb & 0xFF; 
     } 

をプログラムしかし、それは私が考える良い方法はありません。処理するには多くのラムが必要です。それを行う別の方法がありますか?

+2

イメージを1px x 1pxにリサイズすると良い平均が得られます。 – Willian

+2

@William:使用されているスケーリングアルゴリズムに依存することがあります。 ;) – FrustratedWithFormsDesigner

答えて

5

私はリサンプリングとなるだろう。これを行うには

$tmp_img = ImageCreateTrueColor(1,1); 
ImageCopyResampled($tmp_img,$im,0,0,0,0,1,1,$x,$y); // or ImageCopyResized 
$rgb = ImageColorAt($tmp_img,0,0); 
+2

デフォルトのリサンプリングアルゴリズムとは何ですか?私はそれが最寄りの人ではないことを望む。 –

3

一つの方法は、ただ1つの画素に画像をスケーリングして、参照としてそのピクセルの色を使用することです。

<?php 
$image = new Imagick('800x480.jpg'); 
$image->scaleImage(1, 1, true); 
$pixel = $image->getImagePixelColor(0,0); 

$red = ($rgb >> 16) & 0xFF; 
$green = ($rgb >> 8) & 0xFF; 
$blue = $rgb & 0xFF; 
?> 

このように、面倒な詳細を処理する必要はありません。よりスマートなスケーリングアルゴリズムを使用して精度を向上させることができます。

編集:より洗練されたアルゴリズムが必要な場合は、代わりにImagick::resizeImageを使用できます。補間フィルタのような異なるアルゴリズムを使用することができます。

+0

スマートスケーリングアルゴリズムは、この場合、より良い解決策ではありません。完璧なスケーリングアルゴリズムは、すべてのソースピクセルを宛先ピクセルに単純に平均するだけです。たとえばバイキュービックはそれほど正確ではありません。 –

+0

はい、それは通常効率が良いため、精度はあまり高くなく、非常に高速で効率的なアルゴです。 – Mehran

+1

単純な平均化よりも「高速で効率的な」唯一の選択肢は、最悪の結果である最近接選択です。画像の中心付近のピクセルを選択するだけです。 –

関連する問題