Comparer 2 images

39 views
Skip to first unread message

Pascal Robichaud

unread,
Jan 22, 2016, 5:04:04 PM1/22/16
to Montréal-Python
Bonjour,

Je cherche à comparer les images des caméras de circulation de la Ville (http://ville.montreal.qc.ca/circulation/) avec l'image qui est affiché quand la caméra ne fonctionne pas, afin de vérifier de façon automatique le nombre de caméras défectueuses.


Par exemple, en ce moment, il y a 30 caméras sur 304 (10%) qui ne fonctionne pas.

J'ai vu des trucs sur Internet, mais si vous avez eu à travailler sur un projet similaire, vos conseils seraient appréciées.

Je suis en train de compléter une page qui montre une miniature de toutes les images des caméras. 

Merci

Pascal

Jean Schurger

unread,
Jan 22, 2016, 6:12:55 PM1/22/16
to montrea...@googlegroups.com
Le vendredi 22 janvier 2016 à 14:04 -0800, Pascal Robichaud a écrit :
> Bonjour,
>
> Je cherche à comparer les images des caméras de circulation de la
> Ville (http://ville.montreal.qc.ca/circulation/) avec l'image qui est
> affiché quand la caméra ne fonctionne pas, afin de vérifier de façon
> automatique le nombre de caméras défectueuses.
>
>

Peux tu pointer une caméra qui ne fonctionne pas ?

Probablement que l'image affichée dans ce cas est toujours la même, et
que tu peux la reconnaître autrement que par son apparence. Son nom/url
peut être ?

Sinon, j'ai obtenu un bon résultat en utilisant pyocr pour obtenir la
chaîne "Image non disponible". Mais c'est un peu lourd.

>
> Par exemple, en ce moment, il y a 30 caméras sur 304 (10%) qui ne
> fonctionne pas.
>
> J'ai vu des trucs sur Internet, mais si vous avez eu à travailler sur
> un projet similaire, vos conseils seraient appréciées.
>
> Je suis en train de compléter une page qui montre une miniature de
> toutes les images des caméras. 
>
> Merci
>
> Pascal
> -- 
> Vous recevez ce message, car vous êtes abonné au groupe
> Google Groupes "Montréal-Python".
> Pour vous désabonner de ce groupe et ne plus recevoir d'e-mails le
> concernant, envoyez un e-mail à l'adresse montrealpython+unsubscribe@
> googlegroups.com.
> Pour envoyer un message à ce groupe, envoyez un e-mail à l'adresse mo
> ntreal...@googlegroups.com.
> Visitez ce groupe à l'adresse https://groups.google.com/group/montrea
> lpython.
> Pour obtenir davantage d'options, consultez la page https://groups.go
> ogle.com/d/optout.

--
Jean Schurger
http://schurger.org
21D0 4702 758D 5656 C0D6 3288 1609 9E15 596A E928

signature.asc

Pascal Robichaud

unread,
Jan 22, 2016, 6:26:15 PM1/22/16
to montrea...@googlegroups.com
Le site ne donne pas directement d'info sur les caméras défectueuses.

C'est pour cela que je veux vérifier l'image.

En efft, c'est toujours l'image que j'avais mis dans mon premier courriel.

Je n'ai pas encore assez creusé pour voir si l'url change. Mais le fichier des données ouvertes donne un lien vers un ficheir GEN123.jpeg. Alors, j'assume que le nom du fichier reste GEN123.jpeg, même si c'est le message de non disponibilité.

Je n'avais pas pensé au OCR. Si c'est reconnu dans l'image de non disponibilité, se sera une option à regarder. Merci
> Pour vous désabonner de ce groupe et ne plus recevoir d'e-mails le concernant, envoyez un e-mail à l'adresse montrealpytho...@googlegroups.com.
> Pour envoyer un message à ce groupe, adressez un e-mail à montrea...@googlegroups.com.
> Visitez ce groupe à l'adresse https://groups.google.com/group/montrealpython .
> Pour plus d'options, visitez le site https://groups.google.com/d/optout .

Pascal Robichaud

unread,
Jan 22, 2016, 6:29:55 PM1/22/16
to montrea...@googlegroups.com
Je viens de finir ma page web qui montre toutes les caméras




Le 22 janv. 2016 à 18:12, Jean Schurger <je...@schurger.org> a écrit :

Pour vous désabonner de ce groupe et ne plus recevoir d'e-mails le concernant, envoyez un e-mail à l'adresse montrealpytho...@googlegroups.com.

Jean Schurger

unread,
Jan 22, 2016, 6:53:08 PM1/22/16
to montrea...@googlegroups.com
Le vendredi 22 janvier 2016 à 18:29 -0500, Pascal Robichaud a écrit :
> Je viens de finir ma page web qui montre toutes les caméras
>
> http://bit.ly/CamerasCircul
>
>

Tu peux aussi faire un sha1 les images c'est plus rapide, et comparer
ton résultat avec le sha1 de l'image de non-dispo.
> > concernant, envoyez un e-mail à l'adresse montrealpython+unsubscrib
> > e...@googlegroups.com.
> > Pour envoyer un message à ce groupe, adressez un e-mail à montrealp
> > yt...@googlegroups.com.
> > Visitez ce groupe à l'adresse https://groups.google.com/group/montr
> > ealpython .
> > Pour plus d'options, visitez le site https://groups.google.com/d/op
> > tout .
signature.asc

Rémy Roy

unread,
Jan 22, 2016, 7:05:17 PM1/22/16
to montrea...@googlegroups.com
L'auteur fait mention de deux algorithmes intéressants: le Mean Squared Error (MSE) le Structural Similarity Index (SSIM). L'idée est de comparé une image avec une autre image de référence et d'obtenir un résultat qui nous indique la similarité. On peut ensuite utiliser ce résultat et voir si les deux images sont similaire et jusqu'à quel point elles sont similaire. Avec quelques tests, tu pourrais facilement déterminer une valeur seuil pour te donner un indice de confiance suffisant pour dire qu'une image de caméras correspond vraiment à une caméra qui ne fonctionne pas.

Rémy

--
Vous recevez ce message, car vous êtes abonné au groupe Google Groupes "Montréal-Python".
Pour vous désabonner de ce groupe et ne plus recevoir d'e-mails le concernant, envoyez un e-mail à l'adresse montrealpytho...@googlegroups.com.
Pour envoyer un message à ce groupe, envoyez un e-mail à l'adresse montrea...@googlegroups.com.

Pascal Robichaud

unread,
Jan 22, 2016, 8:13:57 PM1/22/16
to montrealpython
C'est vrai que je connais l'image que je cherche.

Ce n'est pas comme comparer 2 images inconnues.

Alors, en effet, en faisant un sha1, je connais le résultat. 

Il ne reste qu'à comparer ce résultat avec les images 'live'.

Toujours pratique de pouvoir jaser de projets ;-)



Pour vous désabonner de ce groupe et ne plus recevoir d'e-mails le concernant, envoyez un e-mail à l'adresse montrealpytho...@googlegroups.com.
Pour envoyer un message à ce groupe, adressez un e-mail à montrea...@googlegroups.com.
Visitez ce groupe à l'adresse https://groups.google.com/group/montrealpython .

Nicolas Cadou

unread,
Jan 25, 2016, 10:37:06 AM1/25/16
to montrea...@googlegroups.com
Y a peut-être des pointeurs intéressants ici :

http://www.imagemagick.org/Usage/compare/
Nicolas Cadou

http://ajah.ca
http://ca.linkedin.com/in/nicolascadou

Sean Coates

unread,
Jan 25, 2016, 10:37:07 AM1/25/16
to montrea...@googlegroups.com
C'est vrai que je connais l'image que je cherche.

Ce n'est pas comme comparer 2 images inconnues.

Alors, en effet, en faisant un sha1, je connais le résultat. 

Il ne reste qu'à comparer ce résultat avec les images 'live'.

(Je ne sais pas si c’est un bon pratique de répondre en anglais, mais c’est beaucoup plus façile pour moi si c’est permis… j’espère qu’on est (près-ce-que) tous capable d’en parlez les deux langues q’en même.)

Be careful to verify that the “non-disponible” images are actually all the same files before implementing this. For some reason, they are not (at least in my quick poking around).

For example, these two cameras are currently down:

GEN158
GEN452

However:

sarcasm:~$ curl -sIXGET http://www1.ville.montreal.qc.ca/Circulation-Cameras/GEN158.jpeg | grep Content-Length
Content-Length: 5233
sarcasm:~$ curl -sIXGET http://www1.ville.montreal.qc.ca/Circulation-Cameras/GEN452.jpeg | grep Content-Length
Content-Length: 5143

So they’re different content. And because of this, they’ll obviously have different hashes:

ef00686b3f6892ac32514f99d24e9c5c81f97e5c  -
b956881d40c92a1cc8e6efe744e21aeae5137862  -

S

Danukeru

unread,
Jan 25, 2016, 5:50:30 PM1/25/16
to montrea...@googlegroups.com
What you actually want is a perceptual hash with a set threshold on the hamming distance from a base image. I recommend looking into the pHash library. There are bindings for almost all languages at this point.

--
Vous recevez ce message, car vous êtes abonné au groupe Google Groupes "Montréal-Python".
Pour vous désabonner de ce groupe et ne plus recevoir d'e-mails le concernant, envoyez un e-mail à l'adresse montrealpytho...@googlegroups.com.
Pour envoyer un message à ce groupe, envoyez un e-mail à l'adresse montrea...@googlegroups.com.

Visitez ce groupe à l'adresse https://groups.google.com/group/montrealpython.
Pour obtenir davantage d'options, consultez la page https://groups.google.com/d/optout.



--
<blessing>Unicorns!</blesssing>

Alexandre Bourget

unread,
Jan 26, 2016, 8:23:53 PM1/26/16
to montrea...@googlegroups.com

Imagemagick's compare program is excellent and does all you want. Make sure you take a look.

Pascal Robichaud

unread,
Jan 27, 2016, 7:27:49 AM1/27/16
to montrealpython
I've tried to use it before, but I had problems to install it. Have to check it out.

Pascal Robichaud

unread,
Jan 27, 2016, 7:54:24 AM1/27/16
to montrealpython
J'ai retravaillé le look de l'interface du prototype statique, mais les images sont mises à jour avec celles de la Ville.

Dans une 2e phase, la page sera rendue dynamique pour inclure les icônes de déneigement en temps réel via l'API du site Info-Neige. Pour des raisons d'accessibilités pour les daltoniens, des icônes ont été utilisées plutôt que seulement des lignes de couleur. Pour l'instant, les différentes icônes ont été mises dans la 1re caméra seulement. En été, le bouton de déneigement serait enlevé pour alléger l'interface.

Je veux arranger une version pour cellulaire afin que l'image soit plus large, puisque qu'il ne peut y avoir qu'une seule image par ligne de toute façon.

Les commentaires et suggestions sont les bienvenues.

Pascal Robichaud

unread,
Feb 9, 2016, 1:16:16 PM2/9/16
to Montréal-Python
Viens de faire un premier test pour le hashing à partir d'un exemple trouvé sur Internet.

Mais j'ai une erreur. Je comprends que c'est l'encodage. J'ai tenté de faire des corrections, mais sans succès.

Un petit coup de main serait apprécié ;-)

import hashlib

# Load the original image into memory and calculate it's hash value.
image_file1 = open('GEN35.jpg').read()
hashlib.md5(image_file1).hexdigest()

# Load the modified image into memory and calculate it's hash value.
image_file_2 = open('GEN158.jpg').read()
hashlib.md5(image_file2).hexdigest()

Puis comparer les deux valeurs

J'ai l'erreur

Traceback (most recent call last):
  File "cameras.py", line 16, in <module>
    image_file1 = open('GEN35.jpg').read()
  File "C:\Python34\lib\encodings\cp1252.py", line 23, in decode
    return codecs.charmap_decode(input,self.errors,decoding_table)[0]
UnicodeDecodeError: 'charmap' codec can't decode byte 0x81 in position 251: character maps to <undefined>

Sebastien Bournival

unread,
Feb 9, 2016, 1:33:15 PM2/9/16
to montrea...@googlegroups.com
Tu peux essayer ceci:
image_file1 = open(‘GEN35.jpg','rb').read()  # 'r' for read, 'b' for binary


--

Pierre Thibault

unread,
Feb 9, 2016, 1:34:23 PM2/9/16
to montrea...@googlegroups.com
Je pense que c'est ça:


comme Sebastien.
--


A+

-------------
Pierre

Pascal Robichaud

unread,
Feb 9, 2016, 6:48:36 PM2/9/16
to Montréal-Python
Merci, ça marche en effet en ajoutant 'rb'.

Ceci dit, comme il en a été question dans les échanges, je viens d'essayer avec 6 caméras, et il y a deux fichiers.

C:\Cameras>python cameras.py
c510e5c08ec8f62dcf9de87e63bbd7d8
d99c2295415739c6ba207f7d7a8bb57c
d99c2295415739c6ba207f7d7a8bb57c
d99c2295415739c6ba207f7d7a8bb57c
c510e5c08ec8f62dcf9de87e63bbd7d8
c510e5c08ec8f62dcf9de87e63bbd7d8

S'il y en a juste deux, ce n'est pas si mal, faut juste que je vérifier les 2 cas.

La prochaine étape que je veux faire, c'est de créer une tâche planifiée qui va rouler, par exemple, aux heures, pour vérifier les photos des 304 caméras et mettre un statut Défectueuse 0 ou 1 dans un CSV (ou autre), avec le ID de la caméra, la date, l'heure. 

Ce qui produira des données ouvertes avec lesquels il sera par la suite possible de faire des analyses plus pointues sur la défectuosités des caméras:

le nombre par jour
la durée des arrêts
y a-t-il des caméras qui sont souvent défectueuses
etc.

Des données qui pourraient alors être utilisées dans une ville intelligente pour apporter les correctifs nécessaires pour que le nombre de caméras défectueuses soit au minimum, idéalement à 0.

Gabriel Tremblay

unread,
Feb 9, 2016, 7:26:52 PM2/9/16
to montrea...@googlegroups.com
Je vous suggère d'utiliser autre chose que md5 pour vos hashes. Le risque de collision est trop élevé. Ainsi, dans de rares cas, deux images différentes auront exactement le meme hash.

Aucune idée si votre application doit servir dans un contexte où la sécurité est importante, mais dans tout les cas, passer a sha-256 serait un choix judicieux.



--
Gabriel Tremblay
CEO, Delve Labs inc.

Pascal Robichaud

unread,
Feb 9, 2016, 10:07:09 PM2/9/16
to Montréal-Python
Un petit pas de plus.

Je télécharge le fichier de la photo, je fais le hash, je compare avec les deux valeurs prévues.

J'ai fais un test 'statique' rapide en copiant les liens des photos dans le .py et ça marche!!!

Pour les 303 caméras, il y a une erreur dans le lien de la 442, mais ça, je savais déjà.

Reste a utiliser un CSV pour prendre les infos des caméras (ID, lien) et mettre les réponses dans un autre CSV (ID, Date, Heure, Statut)

Pascal Robichaud

unread,
Feb 9, 2016, 10:15:45 PM2/9/16
to montrea...@googlegroups.com
le md5, c'est juste pcq j'ai pris un exemple sur un site et que je voulais faire vite pour tester le proncipe.

Pour la sécurité, il n'y en a aucune, je veux juste vérifier si la photo de la caméra de surveillance de la circulation de la Ville montre Image non disponible.

Le hash est juste pour comparer la photo avec celle qui montre Image non disponible.

Pascal

Egor M.

unread,
Feb 10, 2016, 11:08:39 AM2/10/16
to Montréal-Python
Looks like «Image non disponible» picture has an extremely high amount of black pixels on it with very few white and even less red. I'd expect it to be quite easy to distinguish by those even compared to a night shot or case when camera is blocked by snow. Or, as suggested many times here, use Image Magick's «compare».

Pascal Robichaud

unread,
Feb 10, 2016, 12:31:41 PM2/10/16
to montrealpython
Good point about the camera being blocked by snow....

I'll make a test and make the image all black and see if it is working ou not.

Mathieu Longtin

unread,
Feb 12, 2016, 8:49:29 AM2/12/16
to Montréal-Python, tremblay...@gmail.com
Pour cette application, comparer des éléments, MD5 est très correct et fonctionne très bien. Les chances de collisions sont minimes à moins d'avoir plus de 1E12 objets. MD5 est à éviter pour la sécurité mais ce n'est pas l'usage discuté.

Egor M.

unread,
Feb 12, 2016, 12:15:14 PM2/12/16
to Montréal-Python, tremblay...@gmail.com
There are exactly two problems with MD5:

1. Not as much fun
2. If they change picture everything breaks

I admit, reason #2 is there only to add more credibility to reason #1.

Egor M.

unread,
Feb 12, 2016, 12:16:05 PM2/12/16
to Montréal-Python
Camera blocked by snow won't produce all-black image. It'll be somewhat colorful because of sensor noise.
Reply all
Reply to author
Forward
0 new messages