Table des matières Python

Dioptres centrés : fonction de transfert optique

1. Introduction

La fonction de transfert optique (FTO) des systèmes optiques est définie dans Fonction de transfert optique. On s'intéresse ici au cas des systèmes de dioptres centrés dont les aberrations géométriques sont calculées par la méthode du tracé de rayons. Le calcul de la figure de diffraction d'une source ponctuelle est expliqué dans Systèmes centrés : diffraction.

2. Fonction de transfert optique locale

2.a. Fonction d'étalement du point

La fonction d'étalement du point est l'éclairement obtenu dans le plan image pour un objet ponctuel monochromatique. Autrement dit, c'est la figure de diffraction d'une source ponctuelle, dont le calcul est expliqué dans Systèmes centrés : diffraction. Notons (U,V) les coordonnées transversales du point source dans le plan objet et (X,Y) les coordonnées d'un point quelconque du plan image. Si l'objet est à l'infini, ses coordonnées sont des angles par rapport à l'axe du système. Les coordonnées dans le plan image sont en fait les coordonnées réelles divisées par le grandissement. La fonction d'étalement du point est notée :

I(X,Y,U,V)

Dans le cas d'un système dépourvu d'aberrations, cette fonction possède une invariance par translation du point source :

I(X,Y,U,V)=I(X-U,Y-V,0,0)

Autrement dit, la figure de diffraction est simplement translatée lorsqu'on décale le point objet. Pour un système présentant des aberrations, cette propriété n'est pas du tout vérifiée. Le plus souvent, les aberrations sont d'autant plus grandes que l'on s'éloigne de l'axe.

2.b. Réponse impulsionnelle

On note Io(u,v) la fonction définissant l'éclairement du plan objet. Pour un éclairage de l'objet incohérent, l'éclairement du plan image est la somme des éclairements obtenus pour chaque point de l'objet :

Ii(X,Y)=Io(U,V)I(X,Y,U,V)dUdV

Pour définir une réponse impulsionnelle et utiliser la théorie des systèmes linéaires, il faut que la fonction d'étalement du point présente l'invariance par translation mentionnée ci-dessus. Ceci ne peut être vérifié sur la totalité du plan image. En revanche, il est possible de faire l'hypothèse d'invariance localement, c'est-à-dire au voisinage d'un point du plan objet particulier. Soient (U1,V1) les coordonnées d'un point particulier du plan objet, qui sont aussi les coordonnées du centre de la tache de diffraction dans le plan image. On définit les coordonnées locales dans les plans objet et image :

u=U-U1v=V-V1x=X-U1y=Y-V1

On définit la réponse impulsionnelle comme l'éclairement du plan image obtenu lorsque les coordonnées locales du point objet sont nulles :

h1(x,y)=I1(x,y,0,0)=I(U1+x,V1+y,U1,V1)

L'invariance par translation locale permet d'exprimer l'éclairement du plan image comme le produit de convolution de l'éclairement de l'objet par la réponse impulsionnelle :

Ii(x,y)=Io(u,v)h1(x-u,y-v)dudv

En principe, l'intégrale s'étend sur un disque au voisinage de zéro. Si on suppose que la réponse impulsionnelle est nulle en dehors de ce disque, on peut étendre l'intégrale sur tout le plan objet.

2.c. Fonction de transfert optique

La fonction de transfert optique locale est par définition la transformée de Fourier de la réponse impulsionnelle locale :

H1(fx,fy)=h1(x,y)exp(-i2π(fxx+fyy))dxdy

Le théorème de convolution conduit au résultat suivant : la transformée de Fourier de l'éclairement du plan image est égale à la transformée de Fourier du plan objet multipliée par la fonction de transfert optique :

TF(Ii)(fx,fy)=TF(Io)(fx,fy)H1(fx,fy)

3. Calcul numérique de la TFO

La réponse impulsionnelle en un point du plan image est l'éclairement obtenu, pour un objet source ponctuel, par application du principe de Huygens-Fresnel. La méthode est exposée dans Systèmes centrés : diffraction.

On considère l'exemple d'une lentille mince convergente. On définit le système de dioptres et on détermine le plan image paraxial pour un objet à l'infini.

from CalculImage import * 
cat = CatalogueVerre() 
n1 = Vide() 
n2 = cat.verre['N-BK7'] 
rc = 1033.0
r = 30.0
dioptre1 = Spherique(0,1.0/rc,n1,n2,r)
dioptre2 = Spherique(2,-1.0/rc,n2,n1,r)
sys = SystemeCentre()
sys.ajouterListe([dioptre1,dioptre2])
PObjet = Position(0)
PObjet.infini = True
sys.matriceTransfert('d')
PImage = sys.image(PObjet,'d')
zi = PImage.z
            

On cherche la TFO au voisinage de l'axe. On place donc la sphère de référence centrée sur l'image paraxiale de l'axe :

zs = dioptre2.z+0.1
R = zi-zs 
sphereImage = SphereImage(zs,[0,0,zi])
sys.ajouter(sphereImage)
planImage = PlanImage(zi,200)
sys.ajouter(planImage)
            

On calcule l'échantillonnage de la phase sur la sphère de référence puis on applique la transformée de Fourier discrète pour obtenir la figure de diffraction du point :

cal = CalculImage(sys)
Nx = Ny = 400
np = 200
rm = 200.0
[P,M,Phi] = cal.surfacePhase(PObjet,0,'d',rm,1,np,Nx)
from TfdImage import *
from numpy.fft import fft2, ifft2
TFP=matriceCentre(fft2(P))
I=matricePuissance(TFP)
Lambda = cal.Lambda['d']
imI = matriceImage(I,2.0,[1.0,1.0,1.0])
figure()
xScale = Nx/(2*rm)*0.5*Lambda*1e-6*R
imshow(imI,extent=[-xScale,xScale,-xScale,xScale])
xlabel('x (mm)')
ylabel('y (mm)') 
            
plotAplotA.pdf

La FTO est obtenue par TFD de la réponse impulsionnelle. La fréquence spatiale maximale est la moitié de la fréquence d'échantillonnage.

H = matriceCentre(fft2(I))
imH=matriceImage(matriceModule(H),1.0,[1.0,1.0,1.0])
fxScale = Nx/(2*xScale)*0.5;
imshow(imH,extent=[-fxScale,fxScale,-fxScale,fxScale])
xlabel('fx (cycles/mmm)')
ylabel('fy (cycles/mm)')
            
plotBplotB.pdf

Quand l'image est sur l'axe, la FTO présente une symétrie centrale. La fonction de transfert de modulation (FTM) est obtenue pour ky = 0 :

FTM = imH[Ny/2]
fx=arange(-fxScale,fxScale,2*fxScale/Nx)
figure()
plot(fx,FTM)
xlabel('fx (cycles/mmm)')
ylabel('FTM')
axis([-200,200,0,1.0])
            
plotCplotC.pdf

La fréquence de coupure est vers 100 cycles/mm mais les modulations de fréquence supérieure à 50 cycles/mm sont considérablement atténuées.

Voyons à présent la TFO pour un point hors de l'axe, par exemple un point objet à 60 minutes d'arc de l'axe. On ajoute un plan image pour obtenir le diagramme de spots :

angle = 60
figure(figsize=(6,6))
xlabel('x')
ylabel('y')
xCentre = cal.diagrammeSpots(PObjet,angle,['d'],0,20)
rAiry = cal.airy(PObjet,'d')
grid(True)
scale=0.1
axis([-scale,scale,-scale,scale])
            
plotDplotD.pdf

Le barycentre des points est utilisé pour définir le centre de la sphère de référence :

sphereImage.PC = [xCentre,0,zi]
Nx = Ny = 400
np = 200
rm = 200.0
[P,M,Phi] = cal.surfacePhase(PObjet,angle,'d',rm,1,np,Nx)
clf()
xlabel('x')
ylabel('y')
title('Phase')
imshow(Phi)
colorbar()

            
plotEplotE.pdf

La réponse impulsionnelle :

TFP=matriceCentre(fft2(P))
I=matricePuissance(TFP)
Lambda = cal.Lambda['d']
imI = matriceImage(I,2.0,[1.0,1.0,1.0])
figure()
xScale = Nx/(2*rm)*0.5*Lambda*1e-6*R
imshow(imI,extent=[-xScale,xScale,-xScale,xScale])
xlabel('x (mm)')
ylabel('y (mm)') 
            
plotFplotF.pdf

La fonction de transfert optique :

H = matriceCentre(fft2(I))
imH=matriceImage(matriceModule(H),1.0,[1.0,1.0,1.0])
fxScale = Nx/(2*xScale)*0.5;
imshow(imH,extent=[-fxScale,fxScale,-fxScale,fxScale])
xlabel('fx (cycles/mmm)')
ylabel('fy (cycles/mm)')
            
plotGplotG.pdf

Cette fois-ci, la FTO n'a plus la symétrie de révolution. Pour tracer une FTM, il faut donc distinguer les deux directions x et y. Par exemple, pour une modulation suivant x :

FTM = imH[Ny/2]
fx=arange(-fxScale,fxScale,2*fxScale/Nx)
figure()
plot(fx,FTM)
xlabel('fx (cycles/mmm)')
ylabel('FTM')
axis([-200,200,0,1.0])
            
plotHplotH.pdf
Creative Commons LicenseTextes et figures sont mis à disposition sous contrat Creative Commons.