Table des matières Python

Illuminants : étude expérimentale

1. Introduction

Différents illuminants, ou sources de lumière, peuvent être utilisés pour effectuer des mesures de colorimétrie ou simplement pour regarder des objets. L'étude expérimentale d'un illuminant consiste à déterminer son spectre. Ses coordonnées trichromatiques, qui définissent sa couleur, sont obtenues par la méthode décrite dans repérage des couleurs CIE XYZ.

2. Spectromètre

L'appareil utilisé pour les mesures est un spectromètre didactique commercialisé par la société Ulice optronique. Il utilise un réseau de 600 traits par millimètres, de taille 30x30 mm, dans un montage de type Czerny Turner à deux miroirs concaves. La mesure d'intensité est effectuée par une barette CCD de 2048 pixels. La lumière parvient au montage optique via une fibre optique. L'appareil nécessite un étalonnage en sensibilité spectrale et un étalonnage en longueur d'onde. Un étalonnage d'usine est fourni avec le logiciel de pilotage.

Le logiciel permet d'exporter les données sous forme d'un fichier texte. Le module python suivant permet de lire ce fichier et d'effectuer différents calculs.

import re
from math import *
class Spectre:
    def __init__(self,filename):
        f=open(filename)
        self.Lambda = []; 
        self.I = [];
        for line in f.readlines():
            li = line.strip()
            li = li.replace(",",".")
            t = re.split('[\s|;]+',li)
            self.Lambda.append(float(t[1]));
            self.I.append(float(t[2]));
        f.close();
    def intensite(self,L):
        for k in range(2047):
            if (self.Lambda[k] <= L)&(L < self.Lambda[k+1]):
                return self.I[k]/self.I[808]
        return 0.0
    def indiceLambda(self,L):
        for k in range(2047):
            if (self.Lambda[k] <= L)&(L < self.Lambda[k+1]):
                return k
        return 0
            

Voici à titre d'exemple, et pour vérification de l'étalonnage en longueur d'onde, le spectre d'une lampe à vapeur de mercure :

from pylab import *
from Spectrometre import *
spectreMercure = Spectre("mercure.txt")
clf()
xlabel('lambda (nm)')
ylabel('I')
plot(spectreMercure.Lambda,spectreMercure.I,c='b')
grid(True)
title(u'Mercure') 
axis([400,700,0,30])
            
plotAplotA.pdf

La raie verte (la plus intense) présente un maximum à 546,3 nm. La résolution en longueur d'onde est 1,5 nm. La longueur d'onde de cette raie obtenue par spectrométrie par transformée de Fourier ([1]) est 546,07 nm. La raie bleue présente un maximum à 436,1 nm, à comparer à la valeur 435,83 nm. Compte tenu de la résolution du spectromètre, l'étalonnage en longueur d'onde est bon.

3. Spectres et coordonnées trichromatiques

3.a. Lampe à incandescence

Le spectre suivant est obtenu avec une ampoule à filament de tungstène, alimentée en 220 V alternatif.

spectreTungstene = Spectre("tungstene.txt")
clf()
xlabel('lambda (nm)')
ylabel('I')
plot(spectreTungstene.Lambda,spectreTungstene.I,c='b')
grid(True)
            
plotBplotB.pdf

Le maximum d'émission n'est pas accessible, puisqu'il est au delà de 820 nm. On effectue un ajustement avec la répartition spectrale de l'émission du corps noir. Le point de référence est à 560 nm.

from CieXYZ import CIEXYZ
cie = CIEXYZ("../ciexyz/ciexyz31.txt")
T=2400
CN=[]
for L in spectreTungstene.Lambda:
    CN.append(cie.corpsNoir(L,T)/100*spectreTungstene.I[808])
plot(spectreTungstene.Lambda,CN,c='r')
            
plotCplotC.pdf

L'ajustement est obtenu pour 2400 K. Cette température est nettement plus basse que la température de l'illuminant standard A (2855 K), qui est réalisé par une lampe à filament de tungstène convenablement alimentée.

On peut aussi calculer les coordonnées trichromatiques de cet illuminant, qui caractérise sa couleur :

cie.setFonctionIlluminant(spectreTungstene.intensite)
def Rf(L):
    return 1
XYZ=cie.spectralF2XYZ(Rf)
xyTungstene=cie.XYZ2xy(XYZ[0],XYZ[1],XYZ[2])
            
print(xyTungstene)
--> [0.4721545873176396, 0.4137771040019727]

La température proximale d'un illuminant est la température du corps noir dont la couleur est la plus proche de celle de cet illuminant. Les coordonnées trichromatiques les plus proches sont obtenues pour un corps noir de 2550 K (à 50 K près):

cie.setIlluminant("CN",2550)
XYZ=cie.spectralF2XYZ(Rf)
xy2550=cie.XYZ2xy(XYZ[0],XYZ[1],XYZ[2])
            
print(xy2550)
--> [0.4725701465526617, 0.41303203439862485]

On remarque que la température proximale est plus grande que la température obtenue plus haut par ajustement des courbes.

3.b. Lampe à fluorescence

Le spectre suivant est obtenu avec une ampoule fluocompacte à usage domestique.

spectreFluo = Spectre("IlluminantFluocompacte.txt")
clf()
xlabel('lambda (nm)')
ylabel('I')
plot(spectreFluo.Lambda,spectreFluo.I,c='b')
grid(True)
            
plotDplotD.pdf

Calculons ses coordonnées trichromatiques :

cie.setFonctionIlluminant(spectreFluo.intensite)
XYZ=cie.spectralF2XYZ(Rf)
xyFluo=cie.XYZ2xy(XYZ[0],XYZ[1],XYZ[2])
            
print(xyFluo)
--> [0.47633130705809024, 0.3924904761213207]

3.c. Lumière du jour

Le spectre suivant est obtenu en faisant l'image du ciel (temps très couvert) sur l'entrée de la fibre optique.

spectreCielGris = Spectre("cielGris.txt")
clf()
xlabel('lambda (nm)')
ylabel('I')
plot(spectreCielGris.Lambda,spectreCielGris.I,c='b')
grid(True)
            
plotEplotE.pdf

Calculons ses coordonnées trichromatiques :

cie.setFonctionIlluminant(spectreCielGris.intensite)
XYZ=cie.spectralF2XYZ(Rf)
xyJour=cie.XYZ2xy(XYZ[0],XYZ[1],XYZ[2])
            
print(xyJour)
--> [0.33493594118804704, 0.36525656880546986]

4. Température proximale

On place les points représentatifs des lumières précédentes sur le diagramme de chromaticité :

from DiaChrom import *
diagram=DiaChrom(cie)
sRGB = XYZ2RGB([0.64,0.33],[0.3,0.6],[0.15,0.06],[0.3127,0.329])
diagram.paintRGB(sRGB,"sRGB",0.002)
figure(1,figsize=(9,8))
xlabel('x')
ylabel('y')
diagram.corpsNoir([2000,2500,3000,3500,4000,4500,5000,5500,6000])
plot([xyTungstene[0]],[xyTungstene[1]],color="r",marker="d",label="Tungstene")
plot([xyFluo[0]],[xyFluo[1]],color="b",marker="h",label="Fluocompacte")
plot([xyJour[0]],[xyJour[1]],color="g",marker="o",label="Ciel gris")
legend();
axis([0.3,0.6,0.3,0.5])
grid(True) 
            
plotFplotF.pdf

la température proximale d'un illuminant est la température du corps noir le plus proche.

La lampe à incandescence se place très proche du lieu des corps noir, avec une température proximale proche de 2500 K.

Pour l'ampoule fluocompacte, il n'y a pas d'équivalent corps noir. La température proximale exacte dépend de la méthode utilisée pour calculer la distance au lieu des corps noir. Graphiquement, on peut l'estimer à environ 2600 K, ce qui est proche de la valeur courante pour les lampes fluocompactes à usage domestique (2700 K). La couleur est légèrement plus rouge que celle d'une ampoule à incandescence.

Pour le ciel gris, la température proximale est de l'ordre de 5000 K.

Références
[1]  C.J. Sansonetti, M.L. Salit, J. Reader,  Wavelengths of spectral lines in mercury pencil lamps,  (Applied Optics, vol. 35 No. 1, 1996)
Creative Commons LicenseTextes et figures sont mis à disposition sous contrat Creative Commons.