Twee jpegs vergelijken en verschillen detecteren
Ik weet dat er allerlei motion scripts zijn maar deze zijn veel te uitgebreid.
Het moet een (snelle) korte function worden.
Ik dacht bijvoorbeeld aan: kleuren tellen, aantallen per kleur en vergelijken met een marge o.i.d.
Is daar een php code voor of weet/heeft iemand een beter idee/hint?
Toevoeging op 11/11/2013 23:20:00:
Ik heb al enig leesvoer gevonden: http://www.robert-lerner.com/imagecompare.php
Gewijzigd op 11/11/2013 21:22:17 door Harry Hartman
http://stackoverflow.com/questions/7727843/detecting-colors-for-an-image-using-php
Wat een lijst weergeeft van alle kleuren.
Hierbij zou je een script kunnen maken die kijkt hoevaak bepaalde kleuren in beide voorkomen (Zwart komt 90%, geel 80%, etc)
Michael - op 12/11/2013 06:55:59:
Hierbij zou je een script kunnen maken die kijkt hoevaak bepaalde kleuren in beide voorkomen (Zwart komt 90%, geel 80%, etc)
Het zou mij verbazen als je hiermee beweging ontdekt. Stel, in plaatje 1 staat een object links in beeld en in plaatje 2 staat dat object iets meer naar rechts. De kleurverdeling van het totale plaatje zal dan niet noemenswaardig veranderd zijn.
Dit zou je kunnen ondervangen door het plaatje in vakken te verdelen en per vak te kijken naar de kleurverdeling. Als je ziet dat in twee of meer vakken de verhoudingen zijn gewijzigd, kan dat duiden op beweging. Als die beweging echter niet heel erg snel is, moet je je vakken klein gaan maken. Wanneer je met jpg werkt, is de kans dat je op kleine vakken veel kleurverschillen ziet echter erg groot, zodat je script dan ten onrechte zal denken dat er beweging is.
Motion detection is nog niet zo eenvoudig. ;-)
Als het puur om de verschillen gaat, zou ik de plaatjes pixel voor pixel vergelijken. Als de kleurwaardes teveel van elkaar afwijken (bij jpeg moet je altijd een marge aanhouden), verhoog je een teller. Aan het eind kijk je hoeveel pixels de twee plaatjes van elkaar verschillen. Is dat meer dan een bepaald percentage van het geheel, dan kun je de plaatjes afwijkend verklaren.
Edit:
Hmm... ik had beter eerst die pagina van Robert Lerner kunnen lezen, want daarin wordt precies dezelfde methode besproken. ;-)
Gewijzigd op 12/11/2013 10:04:13 door Willem vp
- Lees beide images, pixel per pixel.
- Genereer een nieuwe image. Elke pixel is het verschil tussen beide RGB-waarden van de gelezen pixel.
Dat genereert dus een volledig zwarte afbeelding, behalve bij de pixels die anders zijn. Die krijgen een kleur.
Hoe groter het verschil, hoe feller de nieuwe pixel.
Dat ging vlotter dan ik verwacht had, en lijkt wel goed te werken
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
<?php
$source_image1 = '1.jpg';
$source_image2 = '2.jpg';
$im1 = imagecreatefromjpeg($source_image1);
$im2 = imagecreatefromjpeg($source_image2);
if ($im1 && $im2) {
// zien of beide de zelfde afmetingen hebben
if ( ($width1 = imagesx($im1)) != ($width2 = imagesx($im2)) ) {
die('Niet de zelfde afmetingen');
}
if ( ($height1 = imagesy($im1)) != ($height2 = imagesy($im2)) ) {
die('Niet de zelfde afmetingen');
}
// nieuwe image maken met de zelfde afmetingen
$gd = imagecreatetruecolor($width1, $height1);
// alle pixels overlopen
for ($x = 0; $x < $width1; $x++) {
for ($y = 0; $y < $height1; $y++) {
// RGB van de pixel
$rgb = imagecolorat($im1, $x, $y);
$r1 = ($rgb >> 16) & 0xFF;
$g1 = ($rgb >> 8) & 0xFF;
$b1 = $rgb & 0xFF;
$rgb = imagecolorat($im2, $x, $y);
$r2 = ($rgb >> 16) & 0xFF;
$g2 = ($rgb >> 8) & 0xFF;
$b2 = $rgb & 0xFF;
$r_ = abs($r1 - $r2);
$g_ = abs($g1 - $g2);
$b_ = abs($b1 - $b2);
// nieuwe pixel maken met rood = (rood 1 - rood 2); groen = (groen1 - groen2); blauw = (blauw1 - blauw2)
$pixel = imagecolorallocate($gd, $r_, $g_, $b_);
imagesetpixel($gd, $x, $y, $pixel);
}
}
header('Content-Type: image/png');
imagejpeg($gd);
}
?>
$source_image1 = '1.jpg';
$source_image2 = '2.jpg';
$im1 = imagecreatefromjpeg($source_image1);
$im2 = imagecreatefromjpeg($source_image2);
if ($im1 && $im2) {
// zien of beide de zelfde afmetingen hebben
if ( ($width1 = imagesx($im1)) != ($width2 = imagesx($im2)) ) {
die('Niet de zelfde afmetingen');
}
if ( ($height1 = imagesy($im1)) != ($height2 = imagesy($im2)) ) {
die('Niet de zelfde afmetingen');
}
// nieuwe image maken met de zelfde afmetingen
$gd = imagecreatetruecolor($width1, $height1);
// alle pixels overlopen
for ($x = 0; $x < $width1; $x++) {
for ($y = 0; $y < $height1; $y++) {
// RGB van de pixel
$rgb = imagecolorat($im1, $x, $y);
$r1 = ($rgb >> 16) & 0xFF;
$g1 = ($rgb >> 8) & 0xFF;
$b1 = $rgb & 0xFF;
$rgb = imagecolorat($im2, $x, $y);
$r2 = ($rgb >> 16) & 0xFF;
$g2 = ($rgb >> 8) & 0xFF;
$b2 = $rgb & 0xFF;
$r_ = abs($r1 - $r2);
$g_ = abs($g1 - $g2);
$b_ = abs($b1 - $b2);
// nieuwe pixel maken met rood = (rood 1 - rood 2); groen = (groen1 - groen2); blauw = (blauw1 - blauw2)
$pixel = imagecolorallocate($gd, $r_, $g_, $b_);
imagesetpixel($gd, $x, $y, $pixel);
}
}
header('Content-Type: image/png');
imagejpeg($gd);
}
?>
// Moet ik eens uitproberen op een "zoek de 7 verschillen" spelletje
Gewijzigd op 12/11/2013 11:11:48 door Kris Peeters