Menu |
Metho1Fonctionnement du codePrincipe généralLe but du code est de modifier les cartes de luminosité et de réflectance pour diminuer le temps de calcul d’ILLUMINA. Notre stratégie est donc de faire des cartes demandant un moins grand nombre de calcul. Pour ce faire, nous regroupons certains pixels de manière à former un ensemble de zones pour que chacune d’entre elles ne représente qu’un seul calcul pour ILLUMINA. Pour les cartes de luminosité, nous faisons la somme des pixels de chaque zone et la plaçons sur un des pixels de la zone en mettant tout les autres à zéro. La figure 1 montre un exemple d’une carte fictive très petite comportant seulement 4 zones. Les zones sont délimitées par les bordures et chaque chiffre représente la luminosité d’un pixel. Le tableau de gauche est la carte original et celui de droite la carte modifiée qui servira à faire les calculs d’ILLUMINA. Figure 2 Carte de luminosité originale Carte de luminosité modifiée Ainsi, nous devons commencer par choisir un pixel pour chaque zone puis le mettre égal à la somme des pixels sur cette zone. On conserve donc l’importance de la luminosité de chaque zone mais ILLUMINA ne fera qu’un seul calcul pour chacune d’entre elles. En effet, les pixels égaux à zéro ne sont pas pris en compte dans le calcul puisqu’ils ne contribuent pas à la pollution lumineuse. Pour la carte de réflectance, nous utilisons les mêmes zones, mais en faisant la moyenne pondérée par l’intensité lumineuse de chaque zone et en appliquant cette valeur sur chaque pixel. La figure 3 illustre la modification d’une carte de réflectance en utilisant les données de la figure 2. Figure 3 Carte de réflectance originale Carte de réflectance modifiée La valeur des pixels de chaque zone est calculée à l’aide de l’équation suivante. {#R = \frac{\sum_{i} R_i L_i}{\sum_{i} L_i}#} R est la réflectance moyenne qui sera mis sur tous les pixels d’une zone, Ri est la réflectance d’un pixel et Li la luminosité du même pixel. On somme pour tous les pixels d’une zone. Afin de diminuer le nombre de calcul tout en gardant une bonne précision des résultats, il est important de garder une haute résolution près du point d’observation. Les pixels restent donc inchangés à l’intérieur d’un certain rayon autour du point d’observation, puis commencent à se regrouper en zones de plus en plus grandes à mesure qu’ils s’en éloignent. La fonction choisie pour calculer les grandeurs des zones est proportionnelle à l’inverse de la distance au point d’observation (1/r) car il s’agit d’un phénomène isotropique à deux dimensions. La figure suivante montre de telles zones. Les teintes sont aléatoires pour permettre de distinguer les zones. Figure 4 : Un exemple de zones ne dépendant que de la distance au point d'observation De plus, les régions géographiques possédant une forte émission lumineuse ont plus d’effet sur les résultats calculés par ILLUMINA et il est donc judicieux de garder une meilleure résolution pour ceux-ci. C’est pourquoi la fonction servant à calculer la grandeur des zones est aussi proportionnelle à la luminosité des pixels. L’exemple suivant montre l’effet de la luminosité sur la grandeur des zones. La première carte est la luminosité et la deuxième montre des zones qui ont été calculés avec la luminosité de la carte précédente comme seul paramètre. Figure 5 : Carte de luminosité du sud du Québec Figure 6 : Un exemple de zones ne dépendant que de la luminosité de la figure 4 Une fois, que nous avons lancé les calculs avec les nouvelles cartes, ILLUMINA génère deux cartes de résultat. Toutefois, ces cartes ne sont pas représentatives car la luminosité des zones a été placée sur un seul pixel. Nous avons alors créé un code permettant de reconvertir les cartes en ayant une valeur pour tous les pixels. Le principe est d’utiliser les cartes de luminosité originale pour s’avoir, pour chaque pixel, sa proportion de la luminosité totale de sa zone. Ainsi, on utilise ces proportions pour redistribuer la valeur de chaque zone des cartes de résultats. On retrouve donc des cartes d’une précision très semblable à ce qu’on aurait obtenu en faisant tous les calculs. La figure suivant illustre comment le code s’y prend. Figure 7 : Carte de résultat, carte de proportion lumineuse et carte de résultat modifié La première carte est la carte de résultats qu’ILLUMINA a transmit. La deuxième carte à été réalisée avec les données du premier exemple, c’est la proportion de l’intensité lumineuse de chaque pixel par rapport au total de sa zone. La troisième carte a été réalisée en multipliant les valeurs de la carte de résultat de chaque zone avec la valeur de ses pixels correspondant sur la deuxième carte. On obtient donc une carte avec une valeur pour chaque pixel et qui représente bien ce qu’ILLUMINA aurait généré si on avait lancé tous les calculs. Par exemple, un pixel qui n’a aucune luminosité donne une proportion nulle sur la deuxième carte et donc un résultat nul sur la carte finale ce qui correspond bien à la réalité puisqu’il ne contribue pas à la pollution lumineuse. Dans le même ordre d’idée, un pixel fortement lumineux par rapport à sa zone à une proportion plus élevée et un résultat aussi plus élevé ce qui est conforme à la réalité. Algorithme de détermination des zonesLe code est divisé en deux fichiers, rand_pre.c et rand_post.c, qui sont respectivement pour le traitement avant et après ILLUMINA. Ils se trouvent en annexe. Le cœur du code est dans la création des zones de regroupement. C’est pourquoi nous expliquons en détail cet algorithme. Le reste du code est assez standard et une explication détaillée de son fonctionnement ne révèlerait pas de faits importants par rapport à la méthodologie de ce projet. La méthode employée est basée sur les probabilités. Nous définissons une fonction qui attribue à chaque pixel une certaine probabilité. Tel que défini plus haut, la fonction diminue selon l’inverse de la distance et augmente proportionnellement à l’intensité lumineuse. La voici : p = pr2 * ( r2 - r1 ) / ( d * ( 1 - pr2 ) + r2 * pr2 - r1 ) + imp * l / g p = probabilité attribuée au pixel d = distance au point d’obervation r1 = rayon où la fonction de probabilité en 1/r touche 1 r2 = rayon où la fonction de probabilité en 1/r touche pr2 pr2 = probabilité à r2 imp = importance relative de l'intensité lumineuse sur la fonction de probabilité. l = luminosité du pixel g = luminosité maximale Ensuite, un nombre aléatoire entre 0 et 1 est tiré pour chaque pixel. Si ce nombre est en dessous de la probabilité du pixel, le pixel est choisi pour représenter une zone. Nous obtenons une carte ressemblant à la figure suivante où les points blancs représentent les pixels choisis et seront donc le centre d’une zone. Figure 8 : Carte des pixels représentant une zone (randmap) La prochaine étape du code est alors de déterminer pour chaque pixel de la carte qu’elle est le pixel choisi le plus près afin de créer les zones. C’est cette opération qui peut être la plus longue de l’algorithme car pour chaque pixel il faut scanner un grand nombre de pixels autour de lui-même afin de trouver le pixel choisi le plus près. La méthode utilisée est de scanner en spirale autour des pixels. Toutefois, puisque dans un univers de pixels carrés les spirales sont aussi de forme carrée, le premier pixel trouvé dans le scan n’est pas nécessairement le pixel le plus près. La figure suivante en montre un exemple. Figure 9 : Un exemple de spirale pour attribuer une zone à un pixel Dans cet exemple, le programme devrait effectuer un tour supplémentaire pour trouver le pixel le plus près car ce n’est pas le premier sur la trajectoire mais celui situé au centre gauche. Donc le code doit continuer quelques tours quand il trouve un premier pixel. Toutefois, il doit savoir s’arrêter au bon endroit pour éviter de scanner toute la carte à chaque pixel ce qui prendrait un temps énorme. La figure suivante illustre comment s’assurer de trouver le bon pixel tout en en scannant un minimum. Figure 10 : Scan complet pour un pixel Lorsque le scan trouve un premier pixel, on calcul sa distance au point de départ puis on continu la spirale jusqu'à avoir scanné tous les pixels d’un carré de côtés égales au double de la distance calculé précédemment. Ainsi, nous avons calculé tous les pixels à l’intérieur et en périphérie d’un cercle de rayon égal à la distance calculé pour le premier pixel. Nous pouvons donc être sûrs de trouver le pixel le plus près car il est nécessairement à l’intérieur ou en périphérie de ce cercle. Pour chaque pixel choisi que la spiral rencontre, le code calcule sa distance au point de départ et à la toute fin il renvoie les coordonnées du point ayant la plus petite distance. Nous obtenons ainsi une carte de zones ressemblant à la suivante. (les teintes sont aléatoires) Figure 11 : Carte de zones complète Une fois toutes les zones déterminées, nous pouvons commencer à traiter les cartes de luminosité et de réflectance de la façon expliquée plus haut. Modifications des intrantsNous avons aussi remarqué que le programme ILLUMINA ne prenait pas en considération la variation de pollution lumineuse entre les régions rurales et les régions urbaines. En effet, les modèles et le nombre de lampadaire par km2 de lampadaire en campagne ne sont pas les mêmes qu’en ville. Nous avons donc décidé de prendre un échantillon des lampadaires dans une région rurale près de la ville de Sherbrooke. Le village que nous avons choisi pour l’échantillonnage est la petite municipalité de Stoke. Nous sommes allés durant le jour pour dénombrer les lampadaires dans la région, en supposant que cet échantillon est représentatif du reste des régions rurales du Québec. Nous classifions les lampadaires dans deux catégories : Les bons lampadaires (Cobra Head et Hélios des lampadaires qui dirigent une bonne partie de leur lumière vers le bas) et les mauvais lampadaires (Lampes de ferme, qui dirigent beaucoup plus de lumière vers le haut). Après le recensement, on constate effectivement qu’il y a avait une grande différence entre les régions rurales et les régions urbaines au niveau des ratios, des nombres et de la pollution lumineuse des bons et mauvais lampadaires. Nous nous apprêtions à essayer d’intégrer ces nouvelles valeurs dans Illumina mais nous avions oublié qu’il fallait calculer les paramètres photométriques des lampadaires de ferme, puisque ces données ne se trouvent pas dans ILLUMINA puisqu’elles ne possédaient que des valeurs des régions urbaines qui ne contiennent pas de lampadaire de ferme (image ci-dessous). Pour mesurer les paramètres photométriques du lampadaire de ferme, il a fallu trouver un endroit assez sombre pour éviter toute réflexion de la lumière. Nous avons ensuite utilisé un luxmètre que nous avons placé à une certaine distance du lampadaire que nous avions allumé et nous avons pris en note les mesures de luminosité à tout les 5°. Il aurait été idéal de prendre les mesures à tous les degrés, mais il est possible de crée une bonne courbe de tendance avec seulement les mesures à tous les 5 degré. Nous avons ensuite créé un programme en C appelé cubic_interpolation.c pour interpoler les données et avoir une valeur de la luminosité à n’importe quel angle. Pour chaque segment entre deux points, le code calcule un polynome de degré 3 passant par ces deux points et les deux autres points à gauche et à droite du segment. Ensuite, il calcule la valeur de la luminosité pour chaque degré avec ces polynomes. Le code se trouve en annexe. En prenant des mesures photométriques d’un lampadaire de ferme qui nous a été fourni par le Cegep de Sherbrooke, nous avons constaté que ces valeurs étaient nettement différentes des valeurs des lampadaires Cobra Head. Cela nous a poussé à nous questionner sur la qualité de notre échantillon et sur ce que nous avions définit comme un lampadaire de ferme. Nous avons fini par prendre la décision de retourner à Stoke pour refaire notre échantillon mais cette fois nous sommes allés durant la nuit. La décision de retourner à Stoke la nuit était dûe au fait que durant la soirée, les lampadaires sont allumés et au lieu de classifier les lampadaires selon les modèles et leur forme, nous pourront les classifier selon leur formes.Les nouveaux résultats que nous avons obtenus étaient très différents des premiers. Cela est en partie dû au fait que notre taille échantillonnale était beaucoup plus grande au 2e dénombrement. Avec nos nouvelles données et les nouvelles cartes, il était nécessaire de décider des nouvelles zones pour les calculs d’ILLUMINA, sinon les nouvelles données photométriques ne serviraient pas. Il fallait se servir des anciennes cartes et les zones ayant les plus grandes concentrations de lumière feront partie de la nouvelle zone « ville » à laquelle on attribuerait les anciennes données photométriques d’ILLUMINA. Après avoir estimé l’endroit où se trouvaient les grandes zones lumineuses (entre autres Montréal, Québec et Trois-Rivières), il fallait estimer leur superficie par des cercles. Pour calculer ces rayons, il fallait aller sur Google Maps et effectuer une capture d’écran de la région et calculer le rayon à partir de power Point (En dessinant un cercle autour de la région et avec deux rayons perpendiculaires, estimer le centre de la région) En retournant sur Google Maps, on sélectionne le point centre indiqué sur le Power Point sur la carte Google, pour en connaitre les coordonnées géographiques. On effectue les mêmes manipulations pour un point situé sur la circonférence du cercle et ensuite nous nous servions des coordonnées du graphique pour calculer le rayon avec l’aide d'un site Internet trouvé grâce à une recherche sur Google. Le reste de la carte, une fois que l’on exclut les zones « ville », « Sherbrooke » et « Mégantic », sera considérer comme étant la zone « campagne » à laquelle on demandera à ILLUMINA d’utiliser nos nouvelles mesures photométriques. |