Autor Zpráva
matak
Profil
Potřebuji zjistit jakou dominantní barvu má obrázek, zjistit procentuální zastoupení jednotlivých barev jsem tak nějak schopen udělat, ale jak tohle převést na zelená, červená, modrá? rozumíte, prostě základních cca 8 barev?

nemá někdo nápad?


v podstatě hledám skript co umí tohle http://whatsitscolor.com/index.php
Darker
Profil
Tak sniz barevnou hloubku na 8 barev, pak zjisti nejvic zastoupenou a mas to...
matak
Profil
ale to jsem snad i udelal, jenomze ja potřebuji určit zelená, modrá, červená, žlutá, černá, bílá, fialová, růžová, hnědá rozumíme si?

takže teď sice mám 8 nejvíce zastoupených barev, což je třeba 5 odstínů zelené, jenomže jsem nedokázal najít algoritmus jak určit jestli ta barva je zelená což vypadá na oko, nebo je hnědá, mám rgb ale jak podle toho určit základní barvy?

je trochu srozumitelné co píšu?
Rellik
Profil
tohle by nepomohlo? http://cz.php.net/manual/en/function.imagecolorallocate.php
případně něco podobného co pracuje s barvou obrázku... http://cz.php.net/manual/en/function.imagecolormatch.php http://cz.php.net/manual/en/function.imagecolorexact.php atd...
matak
Profil
no dobře, uděláte něco co zjistí 8 nejpoužívanějších odstínů barev, např.

tento výsledek

1928 606040
1468 e08000
1129 f0c000
1109 f0a000
819 404020
752 e0a000
604 f0e000
581 606020
477 406020
429 c06000
380 e06000
340 a02020
281 202000

první sloupeček je počet výskytů a druhý je HEX

to bych měl, jenomže umím sice z hex získat rgb i hsl, ale jak získat základní barvu???

zelená, modrá, červená, žlutá, černá, bílá, fialová, růžová, hnědá
Rellik
Profil
matak:
Potřebuji zjistit jakou dominantní barvu má obrázek...

...
1928 606040
1468 e08000
1129 f0c000
1109 f0a000
819 404020
752 e0a000
604 f0e000
581 606020
477 406020
429 c06000
380 e06000
340 a02020
281 202000

první sloupeček je počet výskytů a druhý je HEX

Vždyť sis to už udělal dominantní barva je ta, která má největší zastoupení a to je ta první...
matak
Profil
no to takhle nejde rict to je jen odstin, a i kdyby tak jak poznat jaka zakladni barva je odstin, protoze pro pocitac je to docela tezke, ono totiz tmave cervenou snadno rozpozna jako hnedou, jak tohle resit
Rellik
Profil
v tom případě si tu HEX barvu převeď a rozkuchej na RGB - podíl barev podle toho pak budeš mít výstup HEX 606040 -> R=96 G=96 B=64 z toho vyplývá že v tomto odstínu je červené i zelené stejně. Porovnej tak třeba první tři nejvíce zastoupené barvy a porovnej mezi nimi ten rozklad RGB a měla by ti pak vyjít nejvíce zastoupená barva...

1928 606040 -> R=96 G=96 B=64
1468 e08000 -> R=224 G=128 B=0
1129 f0c000 -> R=240 G=192 B=0

největší podíl má zelená...

EDIT: když se na to ale tak dívám, tak je to celkem blbost... musel bys to ještě nějak porovnat s těmi tvými základními barvami a podle toho zjistit co je to za odstín...
R= ff0000 - 25500
G=00ff00 - 02550
B = 000ff - 00255
Y = ffff00 - 2552550

a pak ty další co tam máš napsané...
etexweb
Profil
Jednoduché riešenie:
<?php
/*(C) 2011 EtexWEB API Development
 * Richard Dobroň
 * Color Palette v1.2
*/

function FarbyObrazku($max, $img) {
   $img = imagecreatefromjpeg($img);
  
   $w = imagesx($img);
   $h = imagesy($img);
	$pocet = 0;
  
   for($y=0;$y<$h;$y++) {
      for($x=0;$x<$w;$x++) {
         $rgb = imagecolorat($img, $x, $y);
         $r = ($rgb >> 16) & 0xFF;
         $g = ($rgb >> 8) & 0xFF;
         $b = $rgb & 0xFF;        
         $arr[] =  "#".str_repeat("0",2-strlen(dechex($r))).dechex($r).str_repeat("0",2-strlen(dechex($g))).dechex($g).str_repeat("0",2-strlen(dechex($b))).dechex($b);
	$pocet++;
      }
   }

function cmp($a, $b) {
    if ($a == $b) {
        return 0;
    }
    return ($a > $b) ? -1 : 1;
}


$aa = array_count_values($arr);
uasort($aa,'cmp');$n=0;
foreach($aa as $cc) {
if($n <=$max) {
    $xx = array_keys($aa);
echo "<div style=\"display:inline-block;height: 26px;width: 26px;border:1px solid #000000;margin-left:1px;background: ".$xx[$n]."\"></div>"; //title=\"".Round(substr($pocet,0, 3)/100*substr($cc,0, 2))." %\"

}
$n++;
}
}
echo FarbyObrazku(8, "go_image_r_13465_1000_800.jpg");


a alebo

<?php
function colorPalette($imageFile, $numColors, $granularity = 5)
{
   $granularity = max(1, abs((int)$granularity));
   $colors = array();
   $size = @getimagesize($imageFile);
   if($size === false)
   {
      user_error("Unable to get image size data");
      return false;
   }
   $img = @imagecreatefromjpeg($imageFile);
   if(!$img)
   {
      user_error("Unable to open image file");
      return false;
   }
   for($x = 0; $x < $size[0]; $x += $granularity)
   {
      for($y = 0; $y < $size[1]; $y += $granularity)
      {
         $thisColor = imagecolorat($img, $x, $y);
         $rgb = imagecolorsforindex($img, $thisColor);
         $red = round(round(($rgb['red'] / 0x33)) * 0x33);
         $green = round(round(($rgb['green'] / 0x33)) * 0x33);
         $blue = round(round(($rgb['blue'] / 0x33)) * 0x33);
         $thisRGB = sprintf('%02X%02X%02X', $red, $green, $blue);
         if(array_key_exists($thisRGB, $colors))
         {
            $colors[$thisRGB]++;
         }
         else
         {
            $colors[$thisRGB] = 1;
         }
      }
   }
   arsort($colors);
   return array_slice(array_keys($colors), 0, $numColors);
}
// sample usage:
$palette = colorPalette('rmnp8.jpg', 10, 4);
echo "<table>\n";
foreach($palette as $color)
{
   echo "<tr><td style='background-color:#$color;width:2em;'>&nbsp;</td><td>#$color</td></tr>\n";
}
echo "</table>\n";
Rybka
Profil *
etexweb:
Tak jsem to zkusil a to první řešení s některými obrázky nefunguje. To druhé jede zdá se se vším.
Dá se to nějak předělat aby to krom nejpoužívanější barvy vypsalo i její kontrastní barvu? Když bude třeba dominantní modrá, vypíše to opak což je žlutá..
Rellik
Profil
Trochu sem se s tím pohrál a dal na web. Navíc je tam přidaný výpis invertních barev. Nevím jaké by to mohlo mít využití, krom toho co mě napadlo - viz popisek na stránce http://firstpage.profitux.cz/?page=barvy
mcmatak
Profil *
Ja myslím ze si nerozumime. Tak jinak mate rgb, jak z toho dostat název barvy
Rellik
Profil
mcmatak:
Ja myslím ze si nerozumime. Tak jinak mate rgb, jak z toho dostat název barvy
Tak taky jinak: Jaké to pak má mít využití? Takhle každý udělá svoji verzi. Když není jasné na co to má být tak se celkem těžko radí nějaký výsledek...
mcmatak
Profil *
Vyhledat v databazi fotek zelené, zlute, cervene laděnou fotku
Rellik
Profil
Tak to bych teda tak složitě nedělal. Stačí při uploadu fotky přidat do DB záznam o barevné tonalitě a pak to podle toho filtrovat. Takhle to nikdy 100% fungovat nebude...
mcmatak
Profil *
No to je přesně to co chci delat , ale jak tam ten záznam dostanu
Rellik
Profil
tož jak.... selectem... při uploadu se jen vybere tonalita a hotovo...

<select name="tonalita">
<option value="cervena">červená</option>
<option value="zelena">zelená</option>
<option value="modra">modrá</option>
<option value="zluta">žlutá</option>
atd...
</select>

V DB pak bude položka třeba taky "tonalita" a pak se to podle toho bude na stránce filtrovat...
mcmatak
Profil *
Hm u 15000000 fotek? Znas někoho kdo se do toho pustí?
Rellik
Profil
Patnáct miliónů fotek?? To bych chtěl teda vidět kde to je možné na jednom webu..
Jinak bych to teda pak nejspíš řešil tím jak sem psal výš - rozdělit ten kód barvy na RGB, zjistit které barvy je tam nejvíc a podle toho zobrazit.
http://diskuse.jakpsatweb.cz/?action=vthread&forum=9&topic=130290#8

Nevyjde to sice na 100%, ale co ve vyhledavači je 100%, že...?
mcmatak
Profil *
Dobrá takže to nejde ručně to víme a s tím rozdělením na rgb stále nechápu jak má počítač poznat ze je to červená ne hnědá. Např tohle 606040 je jaká barva?
pavuk
Profil
mcmatak:
Např tohle 606040 je jaká barva?
To je pískově zelená...
1Pupik1989
Profil
Já bych si udělal pole těch základních barev a pak je ve for provnával a vybral tu nejbližší. Schválně to zkusím odpoledne, také potřebuji zjistit barvu, abych mohl vytvořit podklad pro obrázky do galerie.
mcmatak
Profil *
pavuk:
Ale ja sem psal ze mohu použít pouze osm barev, takže ne piskove zelená ale na výběr mam pouze zelená a jak by to měl na základě rgb počítač přiřadit?
pavuk
Profil
mcmatak:
Mno... omlouvám se, to byl jen vtip, stejně jako krvavě zelená nebo hráškově červená... jen jsemmm prostě nemohl tomu popisu #606040 odolat
Moderátor Chamurappi: Nevadí.
Rellik
Profil
mcmatak:
jak by to měl na základě rgb počítač přiřadit
No celkem jednoduše - rozkladem toho čísla na R G B - které položky je nejvíc - v tomto případě by to byla červená i zelená zároveň. Takže by to obrázek zobrazilo při vyhledávání zelené i červené.
mcmatak
Profil *
Modrá a žlutá rovná se zelená ? :-) nebo jak to je? Ja už si to nepamatuju, to asi nepůjde

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0