Twee jpegs vergelijken en verschillen detecteren

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Harry Hartman

Harry Hartman

11/11/2013 21:15:36
Quote Anchor link
Het is de bedoeling twee opvolgende cam snapshots te vergelijken in hoeverre ze gelijk zijn of anders gezegd, in hoeverre ze van elkaar afwijken.
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
 
PHP hulp

PHP hulp

26/04/2024 19:46:12
 
Michael -

Michael -

12/11/2013 06:55:59
Quote Anchor link
Ik vond dit script
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)
 
Willem vp

Willem vp

12/11/2013 09:37:30
Quote Anchor link
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
 
Kris Peeters

Kris Peeters

12/11/2013 10:33:33
Quote Anchor link
Mijn eerste gedacht was:
- 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)
PHP script in nieuw venster Selecteer het PHP script
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
<?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);

}

?>



// Moet ik eens uitproberen op een "zoek de 7 verschillen" spelletje
Gewijzigd op 12/11/2013 11:11:48 door Kris Peeters
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.