Programme en Python et/ou en C pour connaître l'intensité reçu par un pixel...

Démarré par Laure-Anh, Octobre 11, 2015, 17:10:21

« précédent - suivant »

marco56

Une manoeuvre réussie est une catastrophe évitée de justesse.

Laure-Anh

Citation de: marco56 le Novembre 11, 2015, 23:06:06
Voici l'adresse :
http://obelix56.free.fr/spip.php?article55
Tu prends "info-eleve.pdf".
Si tu souhaites t'entraîner, tu peux aussi télécharger le fichier-eleve.
Les fichiers pdf python-eleve et scilab-eleve sont des parties de info-eleve.
Si tu le souhaites, je peux ne mettre que la partie sur le traitement d'images, il faut juste que je recompile les fichiers.
Enfin, j'ai la version prof (avec les solutions). Si tu veux, tu peux me contacter à l'adresse du site (remplace le premier . par  [at] )

Merci infiniment Marco56.
Je regarde ça. Je te contacterai directement plus tard.

marco56

Une manoeuvre réussie est une catastrophe évitée de justesse.

Laure-Anh

Bonjour,

Je reviens vers vous pour mon TP.

J'ai choisi de reproduire un autofocus passif, plus précisément l'autofocus à mesure de contraste. Pour ce faire, j'ai effectué un montage simplifié en disposant une source lumineuse suivie d'un diaphragme puis d'une lentille convergente et pour finir par un capteur CCD (constitué d'une seule rampe de pixels horizontale) sur le banc optique. Je fais varier progressivement dans un sens puis dans l'autre la position de la lentille de part et d'autre de la distance qui procure la bonne mise au point et je mesure pour chaque distance en deçà, pour la distance précise de bonne mise au point, pour chaque distance au-delà, et inversement, le comportement de ma rampe de pixels face à la lampe dont l'embout lumineux me sert d'objet à photographier.

Je n'ai pas d'images à l'issue de mon étude. Aucune image à analyser. Uniquement des courbes.

Les courbes issues du capteur CCD sont des courbes de tensions directement proportionnelles aux intensités lumineuses enregistrées par la barrette en fonction du temps ; ces courbes complétées par une courbe de "balayage" linéaire de la barrette CCD (laquelle courbe associe une valeur en volts à un instant t) permettent au final d'associer à chaque pixel de ma barrette CCD horizontale la valeur d'intensité lumineuse reçue au cours de l'étude du phénomène.

Après avoir cherché sur internet et dans les livres consacrés à cette étude, un problème se pose : celui du tracé des profils de contraste.
Les définitions du contraste varient d'un auteur à l'autre.

La première méthode est d'établir le contraste par pixel. Avec pour formule : contraste(p)=(Lmax-Lmin)/(Lmax+Lmin) avec Lmax et Lmin les luminances maximale et minimale au "voisinage" du pixel p sans précision concernant le terme "voisinage".
La seconde méthode de calcul du contraste consiste quant à elle à calculer la variation d'intensité lumineuse d'un pixel à un autre et à moyenner la somme des variations sur tous les pixels de la barrette CCD.

Laquelle préférer ? Laquelle est la plus appropriée à la mise au point photo ? Et si possible pourquoi ? Sachant que mon algorithme est aveugle, qu'il n'a pas d'images à se mettre sous la dent, qu'il a uniquement connaissance des courbes enregistrées et pour chaque courbe la connaissance très approximative de la position que la lentille occupait de part et d'autre de la distance de bonne mise au point.

Si vous avez un algo qui conduirait à la bonne distance de mise au point à me suggérer, ce serait le pied.

Merci par avance de vos avis et conseils,

marco56

Que tu n'aies pas d'image n'est pas très important.
En revanche, ce à quoi il faut accéder, d'une manière ou d'une autre, c'est aux valeurs de luminance (j'appellerais cela plutôt éclairement mais je peux me tromper) pour chaque pixel de la barrette.
La surface de la barrette est de forme rectangulaire ? Étant donné le montage que tu décris, j'imagine que tu as une source monochromatique.
Partant du tableau de valeurs pour chaque pixel, ce que je ferai a priori, c'est de faire le calcul de contraste en passant un masque (une matrice de convolution appelée également noyau de type [[0 -1 0][-1 5 -1][0 -1 0]]) pour chaque point (exceptés les pixels des bords).
Ensuite, si tu souhaites que le contraste soit maximal pour toute l'image, on peut faire une moyenne du contraste de chaque pixel.
Tu as cours sympa ici : xmcvs.free.fr/astroart/Chapitre4.pdf (ce n'est pas de moi...).
Si tu souhaites m'envoyer ce dont tu disposes, je veux bien jeter un oeil. Tu sais où me joindre...
Une manoeuvre réussie est une catastrophe évitée de justesse.

spinup

Citation de: Laure-Anh le Mai 18, 2016, 19:34:48
La première méthode est d'établir le contraste par pixel. Avec pour formule : contraste(p)=(Lmax-Lmin)/(Lmax+Lmin) avec Lmax et Lmin les luminances maximale et minimale au "voisinage" du pixel p sans précision concernant le terme "voisinage".

La seconde méthode de calcul du contraste consiste quant à elle à calculer la variation d'intensité lumineuse d'un pixel à un autre et à moyenner la somme des variations sur tous les pixels de la barrette CCD.
Dans la premiere methode, le "voisinage" c'est la taille de la zone de MAP que tu definis toi même.  Si ton pixel d'interet est a la position p, et que tu definis un voisinage de taille S, tu inclus tous les pixels entre P-S et P+S et parmi les valeurs de luminance de ces pixels tu prends la valeur mi et la valeur max. Plus le voisinage est petit plus tu as une approche fine. Ca suppose aussi que tu fais la MAP a un endroit precis p (un peu comme quand tu choisis une zone ou un "collimateur").
Tu peux choisir comme voisinage la totalité des pixels de ta barrette, ce sera une approche assez grossiere mais qui peut fonctionner sur un montage simple comme le tien.
Dans la deuxieme méthode, tu calcules les variations spatiales de luminance (maximales pour les contours nets), et tu definis une  moyenne de ces variations. Le but est d'obtenir une image qui a le plus de contours nets. Ceci dit je suis pas sur que prendre la moyenne soit une bonne idee, a mon avis prendre le maximum serait plus efficace.
Comme dit marco56, tu peux utiliser un masque de convolution, comme cest en 1D, ici ca sera simplement [-1 2 1].
Ou ca se code simplement en C de cette facon, pour barrette avec 1024 pixels, une luminance L et un contraste C:


C[0]=0;
C[1023]=0;

for (i=1; i<1022; i++)
{

C[ i]= L[ i]-L[i-1] + L[ i]-L[i+1];

}

L'algorithme de MAP est assez simple. Pour les deux méthodes tu obtiens un valeur de contraste C, tu deplaces le moteur pas a pas pour faire augmenter C jusqu'a arriver au maximum. Si C diminue il faut changer de direction, si C augmente il faut continuer tant que ca ne diminue pas.

Apres tu peux raffiner pour augmenter au diminuer le pas de deplacement en fonction de la variation de C, pour gagner en efficacité.




marco56

Je corrige ma matrice et ta,nt qu'à faire celle de spinup (petite erreur de signe mais corrigée dans l'algo) :
en 2D : [[0 -1 0][-1 4 -1][0 -1 0]]
en 1D : [-1 2 -1]
Une manoeuvre réussie est une catastrophe évitée de justesse.

Laure-Anh

Merci à vous deux pour vos réponses rapides. Je pense que je vais utiliser la première méthode en définissant différents voisinages et en les affinant, puis la méthode du masque de convolution.

Marco56, j'ai consulté le site que tu m'as indiqué, cependant je ne suis pas sûre de comprendre comment on choisit la forme [-1 2 -1] de la matrice...  :-\

De plus, pour l'instant je dispose des courbes d'intensité en fonction du temps, et des courbes représentant le déclenchement de la voie Trigger, avec les tableurs donnant les valeurs de chacune. Mon professeur m'a donné une seule indication que je n'ai pu mettre en oeuvre et qui consistait à me placer en mode XY (comme sur un oscilloscope mais avec le logiciel synchronie qui m'a servi à faire toutes mes acquisitions), qu'en pensez-vous ? Mon professeur m'avait dit que cela me permettrait d'avoir directement une courbe d'intensité en fonction des pixels, mais je ne comprends pas comment cela est possible car cela suppose un échantillonnage  ??? J'ai alors pensé à associer à chaque valeur de temps un pixel par la loi : position= (temps écoulé depuis le top) x (longueur de la barette) / (temps de lecture des 2048 pixels) .

Merci encore pour toute l'aide que vous pourrez me fournir,

frmfrm

Je ne sais pas en quelle classe tu es et je n'ai pas tout lu. Je vais peut être te faire une réponse trop simple  et pas adaptée pour ce que tu dois/veux faire ...

Tu peux te faire uns simulation de ce que tu recherches à mettre en évidence avec photoshop.

Tu prends un fond noir, et sur une couche supérieur tu dessines un rond blanc.

Ensuite tu ouvres ton histogramme et tu appliques un flou gaussien sur le disque blanc. Tu peux voir en direct comment le flou joue sur les valeurs des stats de l'histo. Ensuite à toi de mettre en oeuvre un algo qui reproduit ce que tu auras constaté ( ou pas ;) )

marco56

Partons du principe que ta barrette est en 1D, c'est ce que je comprends.
Pour augmenter le contraste en 2 D, on utilise la matrice : [[0 - 1 0][-1 5 -1][0 -1 0]]
Comme tu ne veux pas augmenter le contraste, on peut, pour garder une même moyenne (à peu près), prendre 4 à la place de 5.
En 1D, cela revient à prendre [-1 2 -1].
Pour le calcul, je reste sur mon idée de travailler sur les valeurs à différents instants.
Une manoeuvre réussie est une catastrophe évitée de justesse.

Miaz3

Je l'avais oublié ce fil !

Merci à vous, pour tous ces liens  :)

Surtout à marco56, ton bouquin a l'air d'être enrichissant.
J'ai appris python en autodidacte, mais ça ne va pas me faire de mal !

++

marco56

Citation de: Miaz3 le Mai 19, 2016, 20:51:49
Je l'avais oublié ce fil !

Merci à vous, pour tous ces liens  :)

Surtout à marco56, ton bouquin a l'air d'être enrichissant.
J'ai appris python en autodidacte, mais ça ne va pas me faire de mal !

++


Merci.
Il va falloir que je le change : j'ai corrigé des erreurs.
Une manoeuvre réussie est une catastrophe évitée de justesse.

Laure-Anh

Citation de: marco56 le Mai 19, 2016, 18:39:52
Partons du principe que ta barrette est en 1D, c'est ce que je comprends.
Pour augmenter le contraste en 2 D, on utilise la matrice : [[0 - 1 0][-1 5 -1][0 -1 0]]
Comme tu ne veux pas augmenter le contraste, on peut, pour garder une même moyenne (à peu près), prendre 4 à la place de 5.
En 1D, cela revient à prendre [-1 2 -1].
Pour le calcul, je reste sur mon idée de travailler sur les valeurs à différents instants.

Matrice [[0 - 1 0][-1 5 -1][0 -1 0]] en 2D comme dans l'exemple figurant de ton lien. Ce qui a multiplié le contraste initial par 7...
Et matrice [-1  2 -1] en 1D parce que c'est un filtre passe-haut suffisant dans le cas de ma simplissime rampe horizontale de 2048pixels.
L'application d'un masque de convolution tendra en pratique - si j'ai bien compris vos intentions amicales, à elscode, spinup et à toi - à prouver aux examinateurs que je me suis penchée sérieusement sur le sujet d'étude qui m'a été attribué et que j'ai bien compris l'utilité et le principe d'applications de filtres, dont l'application de filtre passe-haut, quand il s'agit d'analyser dans un contexte plus large une image en 2D.

Pour le calcul, s'agissant d'une barrette CCD horizontale de 2048 pixels, et sachant pertinemment que j'ai formé une image minuscule à tel endroit bien précis couvrant plusieurs pixels bien précis lesquels pixels correspondent à des temps de balayage bien précis le long de ladite barrette, autant démontrer à mes examinateurs que le contraste est maximal là où il est facile à localiser, là où je sais qu'il se trouve, en travaillant pour chaque courbe sur les valeurs à différents instants.

Je vous remercie tous, j'entends par là tous ceux qui sont venus sur ce fil, du fond du coeur.

marco56

Attention, la valeur 7 est lié aux valeurs initiales.
Si on prend 110 à la place de 150, on modifie le résultat.
Il y aura un gain de contraste, mais beaucoup plus faible. Il suffit de refaire le calcul.
Il y a un paramètre oublié dans le document, c'est qu'on fait passer la matrice de convolution en tout point de la matrice image.
De ce fait, les points voisins sont également modifiés.
Pour ton souci, il m'est difficile de te répondre de façon catégorique : il faudrait pour cela que tu fournisses les courbes ou mieux les valeurs données par Synchronie.
Une manoeuvre réussie est une catastrophe évitée de justesse.

Laure-Anh

Je vais présenter mon TP aujourd'hui en examen blanc pour permettre à un pool de profs du lycée de juger de la pertinence et de la consistance du travail accompli.
Le temps de parole octroyé est de 10 minutes. J'affinerai mes travaux en fonction de leurs avis critiques, de l'intérêt soulevé et de leurs éventuelles demandes d'informations complémentaires.

L'autofocus par mesure de contraste sera confronté avec les autres solutions existantes : contraste de phase, hyperfocale, télémétrie,...

Miaz3

J'espère que tout c'est bien passé ?
Sinon je pensais, tu parlais de convolve.
Dans ImageJ tu à la possibilité de jouer avec les matrices et avoir un retour en temps réel si ça peut t'aider ?

Laure-Anh

Tout s'est bien passé.

Toutefois, ils ont tous eu un sourire entendu au coin des lèvres quand j'ai commencé à exposer que j'avais transformé mes mesures en leur appliquant un masque de convolution.
Il était évident qu'à mon niveau de connaissance actuel, j'étais à leurs yeux une jeune qui vient tout juste de découvrir l'intérêt d'utiliser une loupe pour (mieux) chercher un lieu-dit sur une carte routière.
Ils se sont moqués à demis mots mais dans un esprit critique bon enfant et bienveillant.

J'ai au final peu de choses à remanier. La présentation de mon intérêt particulier pour l'AF par mesure de contraste, les travaux menés, les conclusions qui en découlent et mes réflexions vont bien.
La mention d'application de masque de convolution est "inappropriée" - c'est un euphémisme ! - en l'absence de plusieurs longues années d'études et de pratiques supplémentaires.  ::)

Merci encore une fois à tous,

marco56

Citation de: Laure-Anh le Mai 20, 2016, 21:37:10
Tout s'est bien passé.

Toutefois, ils ont tous eu un sourire entendu au coin des lèvres quand j'ai commencé à exposer que j'avais transformé mes mesures en leur appliquant un masque de convolution.
Il était évident qu'à mon niveau de connaissance actuel, j'étais à leurs yeux une jeune qui vient tout juste de découvrir l'intérêt d'utiliser une loupe pour (mieux) chercher un lieu-dit sur une carte routière.
Ils se sont moqués à demis mots mais dans un esprit critique bon enfant et bienveillant.

J'ai au final peu de choses à remanier. La présentation de mon intérêt particulier pour l'AF par mesure de contraste, les travaux menés, les conclusions qui en découlent et mes réflexions vont bien.
La mention d'application de masque de convolution est "inappropriée" - c'est un euphémisme ! - en l'absence de plusieurs longues années d'études et de pratiques supplémentaires.  ::)

Merci encore une fois à tous,


Excuse-moi de te demander cela, mais tu es dans quelle filière et à quel niveau ?
Une manoeuvre réussie est une catastrophe évitée de justesse.

spinup

Ils n'ont pas tout a fait tort pour le masque de convolution. C'est un outil pratique de traitement numerique, mais le plus important est de comprendre le principe de l'operation mathematique (tres simple) realisée.

Laure-Anh

Citation de: spinup le Mai 20, 2016, 21:47:07
Ils n'ont pas tout a fait tort pour le masque de convolution. C'est un outil pratique de traitement numerique, mais le plus important est de comprendre le principe de l'opération mathématique (très simple) réalisée.

On a appris en maths à manipuler les matrices dans tous les sens mais pour autant tant que l'on ne sait pas réellement, tant que l'on n'a pas atteint un niveau de connaissance suffisamment approfondi, tant que l'on n'est pas en mesure de comprendre parfaitement, de créer, de recréer et de manipuler les filtres utilisés en traitement d'images dont les filtres mentionnés dans Astroart, il est, et j'abonde dans ce sens, prétentieux de faire mention "d'application de masque de convolution". Par égard envers ceux qui savent.
Pour Marco56 : je suis en 2ème année post-bac. J'ai achevé un premier mois d'écrits. Je suis en attente des résultats d'admissibilité aux oraux.  ;)

fred134

Citation de: Laure-Anh le Mai 20, 2016, 22:25:06
Pour Marco56 : je suis en 2ème année post-bac. J'ai achevé un premier mois d'écrits. Je suis en attente des résultats d'admissibilité aux oraux.  ;)
Je ne trouve pas que la notion de convolution soit nécessairement "inappropriée" à ce niveau, mais bon, tu fais très bien de savoir juger les attentes de tes profs :-)

spinup

Citation de: Laure-Anh le Mai 20, 2016, 22:25:06
On a appris en maths à manipuler les matrices dans tous les sens mais pour autant tant que l'on ne sait pas réellement, tant que l'on n'a pas atteint un niveau de connaissance suffisamment approfondi, tant que l'on n'est pas en mesure de comprendre parfaitement, de créer, de recréer et de manipuler les filtres utilisés en traitement d'images dont les filtres mentionnés dans Astroart, il est, et j'abonde dans ce sens, prétentieux de faire mention "d'application de masque de convolution". Par égard envers ceux qui savent.
Pour Marco56 : je suis en 2ème année post-bac. J'ai achevé un premier mois d'écrits. Je suis en attente des résultats d'admissibilité aux oraux.  ;)
C'est pas tant que les filtres de convolution sont compliques, au contraire c'est plutot simple, mais je pense que les profs attendent que tu comprennes quel principe mathematique correspond a ce masque.

En l'occurence ici, le masque [-1 2 -1] realise l'equivalent numerique de la derivee spatiale de la Luminance: dL/dx.

Bonne chance et surtout bon courage our tes concours!

jmd2

les examinateurs exigent-ils que les candidats connaissent le fonctionnement de tous les outils utilisés ?
(ce serait totalement idiot)
tu as utilisé un ordinateur. Personne, ni toi, ni eux, ne connaît comment ça fonctionne dans les entrailles.

marco56

Citation de: spinup le Mai 21, 2016, 09:49:18
C'est pas tant que les filtres de convolution sont compliques, au contraire c'est plutot simple, mais je pense que les profs attendent que tu comprennes quel principe mathematique correspond a ce masque.

En l'occurence ici, le masque [-1 2 -1] realise l'equivalent numerique de la derivee spatiale de la Luminance: dL/dx.

Bonne chance et surtout bon courage our tes concours!


Désolé de te contredire, mais c'est plutôt une dérivée seconde, dans le domaine de la discrétisation.
Une manoeuvre réussie est une catastrophe évitée de justesse.

marco56

Citation de: fred134 le Mai 21, 2016, 00:45:37
Je ne trouve pas que la notion de convolution soit nécessairement "inappropriée" à ce niveau, mais bon, tu fais très bien de savoir juger les attentes de tes profs :-)
+1
Une manoeuvre réussie est une catastrophe évitée de justesse.