insan tarafından okunabilir rengini (ör. Kırmızı, Yeşil, vb.) Programsal olarak belirleme Program aracılığıyla bir program aracılığıyla çalışacak ve bana birincil renk (ler) olduğunu söyleyen bir komut dosyası oluşturmaya çalışıyorum.Bir resmin
Şu anda komut dosyası her pikselin RGB değerini alıyor. Onları önceden tanımlanmış kurallarla karşılaştırır ve her rengin piksel sayısını saymaya çalışır.
Sorunum, komutun küçük bir hit ve özlediğidir. Bunu yapmanın daha iyi bir yolu (belki de İngilizce'ye çeviri yapmak için daha kolay olan farklı bir renk kodlama sistemi kullanarak) veya RGB'leri kullanarak renkleri tanımlayan mevcut bir kural grubunu biliyor mu? Eğer bir grafik kütüphanesi var, bu yüzden orada bir ortalama zımbırtı olmalıdır
<?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));
?>
Hmm, ilginç. Korkarım ki tek katkım, "insan tarafından okunabilir" renkleri tanımlamakla ilgili [bu uyarı] (http://www.thedoghousediaries.com/?p=1406)! – Widor
Gerçek renkli bir görüntünün potansiyel olarak her pikselin benzersiz olduğunu düşünürseniz, benzer renkleri birlikte "topluyor" olarak başlatmadığınız sürece fazla kazanmayacaksınız. Belki de görüntüyü 1x1 piksele küçültmek ve baskın rengini anlamak daha kolay olurdu. –
RGB, burada [en az kullanışlı renk modeli seçimi] gibi görünüyor (http://www.wowarea.com/english/help/color.htm). @Widor, şüphesiz betik bir IsGuy parametresi alacaktır. ;) – bzlm