:::: MENU ::::

Afla culoare predominanta dintr-o imagine cu PHP

Nu credeam ca e asa simplu pana nu m-am interesat 🙂
Ca si aplicatie practica, daca ai acces la pozele produselor unui magazin online dar n-ai culoarea intr-un camp separat, poti trece prin codul de mai jos toate imaginile ca mai apoi sa poti face o cautare care pe langa clasicul text de cautat sa pui si un color picker. Sunt mici sansele sa fie un produs EXACT cu culoarea aleasa de utilizator, dar mai poti mesteri programatic (pui sa caute intr-un interval de culori) in asa fel incat sa-ti identifice produsele cu o culoare apropiata. Dupa aceea poti creea intervale predefinite pentru cuvintele gen “rosu,verde,gri,cacaniu :d” iar la cautarea “pijamale verzi” sa ii dai exact pijamelele verzi.


function rgb2hex($rgb){ return sprintf("%06X", $rgb); }
$im = imagecreatefrompng('test.png');
$x = 10; //coordonat x
$y = 20; //coordonat y
$arr = imagecolorat($im, $x, $y);
$coloare = imagecolorsforindex($im, $arr);
$final = rgb2hex($culoare['red'].''.$culoare['green'].''.$culoare['blue']);
echo'Culoare predominanta este #'.$final;

Chiar sunt curios ce implementari ingenioase ii mai gasiti.


6 Comments

  • Reply TTL |

    Cateva sugestii, if I may…

    1. foloseste HSB in loc de RGB pentru nuante “apropiate”
    2. scanezi toata imaginea, elimini pixelii care au culoarea apropiata de ce e pe margine (e.g. poze de produs pe fundal alb)
    3. faci histograma (i.e. spectrul de culori) imaginii si vezi ce varfuri ai
    4. consideri cu o aproximare foarte buna ca varfurile alea sunt culoarea dominanta a imaginii, cel putin din punct de vedere al nuantei (=hue)

  • Reply Cipy |

    Astia de la Google care te-au angajat stiu ca le vinzi algoritmul de image search? 😀

  • Reply TTL |

    As fi vrut eu sa lucrez la Google 🙂 Am studiat putin un algoritm de color matching si am zis ca nu strica sa-l impartasesc cu cineva interesat 😀

  • Reply Andi |

    Am vazut undeva o alfel de solutie, ingenioasa de altfel: faci resize la imagine 1×1 pixeli si ar rezulta o imagine care va primi culoarea dominanta.

So, what do you think ?