プログラムでプログラムを実行し、それが主要な色であることを伝えるスクリプトを作成しようとしています。イメージの人間が読める色(例えば、赤、緑など)をプログラムで決定する
現在、スクリプトは各ピクセルのRGB値を取得します。定義済みのルールと比較し、各色のピクセル数をカウントアップしようとします。
私の問題は、スクリプトが少しヒットしてミスです。誰かがこれをやるより良い方法を知っていますか(おそらく、英語に翻訳しやすい別の色分けシステムを使用しています)か、RGBを使って色を定義する既存の規則セットを知っていますか?あなたはグラフィックスライブラリを持っているので、そこでの平均的なブツがなければならない
<?php
$file = "8629.jpg";
$colors = array("Red" => array("rel" => true, "r" => 0.65, "g" => 0.09, "b" => 0.25, "var" => 0.3),
"Blue" => array("rel" => true, "r" => 0.21, "g" => 0.32, "b" => 0.46, "var" => 0.3),
"Green" => array("rel" => true, "r" => 0, "g" => 0.67,"b" => 0.33, "var" => 0.3),
"Black" => array("rel" => false, "r" => 0, "g" => 0,"b" => 0, "var" => 30),
"White" => array("rel" => false, "r" => 255, "g" => 255,"b" => 255, "var" => 30));
$total = 0;
$im = imagecreatefromjpeg($file);
$size = getimagesize($file);
if (!$im) {
exit("No image found.");
}
for ($x = 1; $x <= $size[0]; $x++) {
for($y = 1; $y <= $size[1]; $y++) {
$rgb = imagecolorat($im, $x, $y);
$r = ($rgb >> 16) & 0xFF;
$g = ($rgb >> 8) & 0xFF;
$b = $rgb & 0xFF;
$colorTotal = $r + $g + $b;
$rRatio = $r > 0 ? $r/$colorTotal : 0;
$gRatio = $g > 0 ? $g/$colorTotal : 0;
$bRatio = $b > 0 ? $b/$colorTotal : 0;
foreach($colors as $key => $color) {
if ($color["rel"]) {
if ((($color["r"] - $color["var"]) <= $rRatio && $rRatio <= ($color["r"] + $color["var"])) &&
(($color["g"] - $color["var"]) <= $gRatio && $gRatio <= ($color["g"] + $color["var"])) &&
(($color["b"] - $color["var"]) <= $bRatio && $bRatio <= ($color["b"] + $color["var"]))) {
$colourCount[$key]++;
$total++;
}
} else {
if ((($color["r"] - $color["var"]) <= $r && $r <= ($color["r"] + $color["var"])) &&
(($color["g"] - $color["var"]) <= $g && $g <= ($color["g"] + $color["var"])) &&
(($color["b"] - $color["var"]) <= $b && $b <= ($color["b"] + $color["var"]))) {
$colourCount[$key]++;
$total++;
}
}
}
}
}
var_dump($colourCount);
foreach($colourCount as $key => $color) {
$colourPrecent[$key] = $color/$total;
}
arsort($colourPrecent);
var_dump($colourPrecent);
foreach($colourPrecent as $key => $color) {
if ($prevVal) {
if ($color < ($prevVal - 0.1)) {
break;
}
}
$primary[] = $key;
$prevVal = $color;
}
echo("The primary colours in this image are " . implode(" and ", $primary));
?>
うん、面白いです。私の唯一の貢献は「人間が読める」色の定義について[この警告](http://www.thedoghousediaries.com/?p=1406)です! – Widor
トゥルーカラーの画像では、すべてのピクセルがユニークである可能性があることを考慮すると、類似の色を一緒に「バッチ処理」しない限り、ほとんど得られません。おそらく、画像を1x1ピクセルに縮小し、その主な色を抽出するほうが簡単かもしれません。 –
RGBは、ここではカラーモデルの中で最も有用な選択肢のようです(http://www.wowarea.com/english/help/color.htm)。 @Widor、確かにスクリプトはIsGuyパラメータを取るでしょう。 ;) – bzlm