Autor | Zpráva | ||
---|---|---|---|
matak Profil |
#1 · Zasláno: 21. 9. 2011, 14:37:28 · Upravil/a: matak
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 |
#2 · Zasláno: 21. 9. 2011, 22:29:13
Tak sniz barevnou hloubku na 8 barev, pak zjisti nejvic zastoupenou a mas to...
|
||
matak Profil |
#3 · Zasláno: 22. 9. 2011, 08:33:36
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 |
#4 · Zasláno: 22. 9. 2011, 09:35:10 · Upravil/a: Rellik
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 |
#5 · Zasláno: 22. 9. 2011, 09:45:19
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 |
#6 · Zasláno: 22. 9. 2011, 09:58:48
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 |
#7 · Zasláno: 22. 9. 2011, 10:04:56
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 |
#8 · Zasláno: 22. 9. 2011, 10:58:39 · Upravil/a: Rellik
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 |
#9 · Zasláno: 22. 9. 2011, 18:57:49 · Upravil/a: etexweb
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;'> </td><td>#$color</td></tr>\n"; } echo "</table>\n"; |
||
Rybka Profil * |
#10 · Zasláno: 22. 9. 2011, 21:07:58
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 |
#11 · Zasláno: 23. 9. 2011, 11:51:51
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 * |
#12 · Zasláno: 23. 9. 2011, 15:18:33
Ja myslím ze si nerozumime. Tak jinak mate rgb, jak z toho dostat název barvy
|
||
Rellik Profil |
#13 · Zasláno: 23. 9. 2011, 16:12:03
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 * |
#14 · Zasláno: 23. 9. 2011, 16:21:06
Vyhledat v databazi fotek zelené, zlute, cervene laděnou fotku
|
||
Rellik Profil |
#15 · Zasláno: 23. 9. 2011, 16:45:04
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 * |
#16 · Zasláno: 23. 9. 2011, 16:48:40
No to je přesně to co chci delat , ale jak tam ten záznam dostanu
|
||
Rellik Profil |
#17 · Zasláno: 23. 9. 2011, 17:31:41
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 * |
#18 · Zasláno: 23. 9. 2011, 18:44:16
Hm u 15000000 fotek? Znas někoho kdo se do toho pustí?
|
||
Rellik Profil |
#19 · Zasláno: 23. 9. 2011, 18:49:54
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 * |
#20 · Zasláno: 24. 9. 2011, 02:46:46
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 |
#21 · Zasláno: 24. 9. 2011, 05:32:57
mcmatak:
„Např tohle 606040 je jaká barva?“ To je pískově zelená... |
||
1Pupik1989 Profil |
#22 · Zasláno: 24. 9. 2011, 08:18:21
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 * |
#23 · Zasláno: 24. 9. 2011, 09:02:21
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 jsem>mm prostě nemohl tomu popisu #606040 odolat Moderátor Chamurappi: Nevadí.
|
||
Rellik Profil |
#25 · Zasláno: 24. 9. 2011, 10:18:37
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 * |
#26 · Zasláno: 24. 9. 2011, 11:12:17
Modrá a žlutá rovná se zelená ? :-) nebo jak to je? Ja už si to nepamatuju, to asi nepůjde
|
||
Časová prodleva: 14 let
|
0