Zdravim,
potrebujem vyriesit jednu vec. Porovnavanie obrazkov. Tj, chcem daco podobne ako similar_text(), len s obrazkami.
dam dva obrazky a vypocita mi zhodu. pokusal som sa take daco napisat, ale neviem ci mi to funguje spravne, pretoze mi to pocita len velmi tesno. tak sa chcem opytat ci s tym dakto nema skusenost.
kod
Kód:
<?php
$im1 = imagecreatefromjpeg('a.jpg');
$im2 = imagecreatefromjpeg('b.jpg');
$zhoda = 0;
for($x = 0; $x<imagesx($im1); $x++){
for($y = 0; $y<imagesy($im1); $y++){
$c1 = imagecolorat($im1, $x, $y);
$c1 = imagecolorsforindex($im1, $c1);
$c2 = imagecolorat($im2, $x, $y);
$c2 = imagecolorsforindex($im2, $c2);
$zhoda += 100-(sqrt(($c1['red']-$c2['red'])*($c1['red']-$c2['red']) + ($c1['green']-$c2['green'])*($c1['green']-$c2['green']) + ($c1['blue']-$c2['blue'])*($c1['blue']-$c2['blue'])) / 255 * 173.20508075689 / 3);
}
}
echo $zhoda/($x*$y) . '%';
?>
aby som vysvetlil vzorec, prisiel som k nemu len da sa povedat nahoduo, takze ani neviem ci je spravny, ale pri pokusoch to fungovalo perfektne. skusal som to tak, ze som spravil obrazok 10*10px (kvoli rychlosti). skopiroval som ho a porovnal tie dva. vypisalo 100%. otvoril som jeden z nich, zmenil som jeden pixel a uz vypisalo 98.533333333333%, aj ked teoreticky by malo vypisat 99% (lebo obrazok ma 100px a jeden je odlisny). ale to som si vysvetlil tak, ze medzi tymi farbami toho jedneho px je tiez nejaky percentualny rozdiel, takze podla mna je to celkom v pohode.
aby som ho vysvetlil.
dakde som sa docital, ze na riesenie tohto problemu je vhodne pouzit vzorec na vypocet vzdialenosti bodov v troch rovinach (
link) zhodou-nahod sme sa to ucili pred dvoma dnami
takze ((x1-x2)^2 + (y1-y2)^2 + (z1-z2)^2)^(1/2) , pricom za
x dosadzam Red, za
y Green a za
z Blue
cele to delim cislom 255, kvoli rozsahu a nasobim cislom 173.2050 (kvoli skale, aby som dostal rozsah od 0 do 100. k tomu cislu som prisiel tak, ze som porovnal ciernu s bielou [asi najvacsia nezhoda]). potom to delim troma, prave kvoli trom rovinam. to vlastne vypocita nezhodu, preto to odcitavam nakoniec cele od 100vky
to by bolo pekne, ale problem je, ze ja to potrebujem pouzit na fotkach dost nekvalitnych. tj seda skala (8bit), rozmery 640*480
"nasimuloval" som si tu fotografiu... vytiahol som fotografiu, dal do sedej skaly 8bit, pridal sum. potom som do tej istej fotografie pridal este trochu viacej sumu (akoze ta ista kompozicia, len fotografovanie akoze o sekundu neskor), a este som nepatrne stmavil niektore casti fotky, akoze zmena svetelnych podmienok (prechadza mrak a podobne)
to mi hodilo zhodu 96%, takze tvarme sa, ze to je tolerancia a bereme to ako zhodny snimok
potom som tam pridal postavu (ocina
)
porovnal som obrazky a ono mi to hodilo zhodu len o par desatin mensiu :/, a to je to preco som vobec zalozil tuto temu.
ja chcem zistit porovnavanim fotiek ci sa na niektorej z nich deje nieco nezvycajne (prechadza auto, clovek), takze potrebujem aby to malo vacsiu citlivost.
ta moja nizka citlivost bude zrejme kvoli tomu, ze je to v zlej kvalite s vysokym sumom a seda skala (skoda, ale take su podmienky)
robim to zle alebo sa to proste v tychto podmienkach neda vyriesit?
dalsia vec je rychlost, ale to nie je take podstatne. pri tychto rozmeroch to trva cca 1,6 sekundy.. da sa to este nejako znizit?
//sorry, ze som zvacosval pismo, ale robil som to preto, ak by nahodou dakto bol lenivy citat cely text.. tak aby sa dostal k pointe
a dufam ze som nepisal ako hotentot