私は、ユーザーが色で検索できる画像検索エンジンを書いています。この一環として、画像がグレースケール(黒、白、またはグレーの色合いのみを含む)であるか、または任意の色を含むかを判断する必要があります。
画像に黒、白、灰色の色合い以外のピクセルが含まれているかどうかをどのように検出できますか?
を使用してすべてのピクセルをウォークスルーする必要がありますimagecolorat()
(例2を参照)。
グレースケールカラーは、赤、緑、青で同じ値になります。値が異なるピクセルを見つけた場合、それは色を含む画像です(少なくとも技術的RGB(100,102,103)
には、人間の目には灰色に見えるような色です)。
サーバーにインストールされているラスターイメージスイートによっては、これらのツールを使用して、Pekkaがここで提供するよりも簡単で正確な答えを得ることができます。これがより高速であるかどうかは、未解決の議論です(以下の注を参照)。
以下のImageMagickサンプル(およびリンク)では、次のことをお勧めします。
画像をHSLに変換してから、詳細情報を出力します(「識別」統計)
詳細な情報を分析すると、質問に対する答えが得られます。したがって、正確でシンプルであり、「ほぼ」灰色の画像について推測する必要はありません。また、ワークフローとニーズに応じて、使用できる可能性のある他のデータも提供します。
出典:http ://www.imagemagick.org/discourse-server/viewtopic.php?t = 19580
画像の変換は基本的にピクセルをループするため、これがPekkaのソリューションよりも速いとは思えません。
だから、スピードに対するペッカの答え。精度のためのこの答え。
以下の機能を提案します。それが機能する方法は、ピクセル単位のRGB値の類似性を見つけることだけです。RGB値が異なるピクセルが1つしかない場合は、カラー画像である可能性があります。ただし、resize_uploaded()
時間を節約するために関数を挿入することをお勧めします。
function detect_greyscale($source_file)
{
$im = resize_uploaded($source_file);
$imgw = imagesx($im);
$imgh = imagesy($im);
$count_grey = '';
$count_color = '';
for ($i=0; $i<$imgw; $i++)
{
for ($j=0; $j<$imgh; $j++)
{
$rgb = ImageColorAt($im, $i, $j);
$rr = ($rgb >> 16) & 0xFF;
$gg = ($rgb >> 8) & 0xFF;
$bb = $rgb & 0xFF;
if($rr == $gg and $rr == $bb and $bb == $gg)
{
$count_grey++;
}
else
{
$count_color++;
}
}
}
imagedestroy($im);
if($count_color>0)
{
return 0;
}
return 1;
}