Note
Aller à la fin pour télécharger le code complet de l’exemple.
Franges d’interférence de Fabry-Perot#
Ce tutoriel présente des techniques de traitement d’image pour analyser les franges d’interférence de Fabry-Perot. On y montre comment charger des images expérimentales, définir des régions d’intérêt, détecter des contours circulaires et extraire des profils d’intensité pour analyser quantitativement les franges.
- Utilisation :
python fabry_perot_example.py
Ce script illustre des flux d’analyse optique couramment utilisés en interférométrie, en métrologie optique et en mesures de précision.
Importer les modules nécessaires#
On commence par importer tous les modules nécessaires au traitement d’image et à la visualisation. Pour exécuter cet exemple, assurez-vous que toutes les dépendances requises sont installées.
import sigima.enums
import sigima.objects
import sigima.proc.image
from sigima import viz
from sigima.tests.data import get_test_image
Charger les images d’essai Fabry-Perot#
On charge deux images d’exemple de franges d’interférence de Fabry-Perot. Elles sont fournies avec les données de test de Sigima. On analysera les franges d’interférence présentes dans ces images.
# Load the first Fabry-Perot test image
img1 = get_test_image("fabry-perot1.jpg")
print("✓ Successfully loaded fabry-perot1.jpg")
print(f"Image dimensions: {img1.data.shape}")
print(f"Data type: {img1.data.dtype}")
print(f"Intensity range: {img1.data.min()} - {img1.data.max()}")
# Visualize the original interference pattern
viz.view_images(img1, title="Fabry-Perot Interference Pattern #1")
✓ Successfully loaded fabry-perot1.jpg
Image dimensions: (1024, 1280)
Data type: uint8
Intensity range: 7 - 94
Définir une ROI circulaire pour l’analyse des franges#
On définit une région d’intérêt (ROI) circulaire centrée sur l’image pour concentrer l’analyse sur les franges d’interférence centrales.
# Calculate image center
center_x, center_y = 601, 559
roi_radius = 460 # Radius to capture the first few interference rings
print(f"\n✓ Image center: ({center_x}, {center_y})")
print(f"ROI radius: {roi_radius} pixels")
print("This ROI focuses analysis on the central interference pattern")
# Create circular ROI coordinates:
roi_coords = [center_x, center_y, roi_radius]
# Apply circular ROI to the image
img1.roi = sigima.objects.create_image_roi("circle", roi_coords, indices=True)
print("✓ Circular ROI applied to image")
# Visualize image with ROI
viz.view_images(img1, title="Fabry-Perot with Circular ROI")
✓ Image center: (601, 559)
ROI radius: 460 pixels
This ROI focuses analysis on the central interference pattern
✓ Circular ROI applied to image
Configurer la détection de contours circulaires#
On peut maintenant détecter des contours circulaires dans la ROI définie. Cela permet d’identifier les anneaux d’interférence. Pour ce faire, la première étape consiste à paramétrer la détection de contours.
# Set up contour shape detection parameter for circles
contour_param = sigima.proc.image.ContourShapeParam()
contour_param.shape = sigima.enums.ContourShape.CIRCLE
contour_param.threshold = 0.5 # Threshold for fringe detection
print("\n✓ Contour detection configured:")
print(f"Shape: {contour_param.shape}")
print(f"Threshold: {contour_param.threshold}")
print("This will detect circular interference fringes")
✓ Contour detection configured:
Shape: Circle
Threshold: 0.5
This will detect circular interference fringes
On peut ensuite exécuter la détection de contours sur l’image à l’aide des paramètres définis.
contour_results = sigima.proc.image.contour_shape(img1, contour_param)
print("\n✓ Contour detection completed for first image")
✓ Contour detection completed for first image
On peut afficher les contours circulaires détectés ainsi que leurs propriétés
print(f"Number of circular contours detected: {len(contour_results.coords)}")
contour_df = contour_results.to_dataframe()
print("\nDetected contours data frame:")
print(contour_df)
Number of circular contours detected: 2
Detected contours data frame:
roi_index x y r
0 0 599.143664 554.735897 403.219910
1 0 595.389606 556.166651 367.348831
Extraire le profil d’intensité horizontal#
On peut extraire un profil d’intensité le long d’une ligne horizontale passant par le centre de l’image. Ce profil met en évidence les variations d’intensité au travers des franges d’interférence. Comme précédemment, il faut paramétrer l’extraction du profil linéaire.
# Configure line profile extraction
profile_param = sigima.proc.image.LineProfileParam()
profile_param.direction = "horizontal"
profile_param.row = center_y # Extract profile through image center
print("\n✓ Horizontal profile configured:")
print(f"Direction: {profile_param.direction}")
print(f"Row: {profile_param.row} (image center)")
# Extract intensity profile
profile_signal1 = sigima.proc.image.line_profile(img1, profile_param)
print(f"✓ Profile extracted: {len(profile_signal1.y)} data points")
print(f"Intensity range: {profile_signal1.y.min():.1f} - {profile_signal1.y.max():.1f}")
# Visualize the intensity profile
viz.view_curves(
[profile_signal1],
title="Horizontal Intensity Profile - Image 1",
xlabel="Position (pixels)",
ylabel="Intensity",
)
✓ Horizontal profile configured:
Direction: horizontal
Row: 559 (image center)
✓ Profile extracted: 919 data points
Intensity range: 12.0 - 83.0
Charger la deuxième image Fabry-Perot#
On souhaite maintenant charger et analyser la deuxième image Fabry-Perot
try:
# Load second test image
img2 = get_test_image("fabry-perot2.jpg")
print("\n✓ Successfully loaded fabry-perot2.jpg")
print(f"Image dimensions: {img2.data.shape}")
# Copy ROI settings from first image
img2.metadata = img1.metadata # This includes the ROI information
# Visualize second image
viz.view_images([img2], title="Fabry-Perot Interference Pattern #2")
except Exception as exc:
raise RuntimeError("Failed to load second Fabry-Perot test image.") from exc
✓ Successfully loaded fabry-perot2.jpg
Image dimensions: (1024, 1280)
Détecter les contours sur la deuxième image#
Pour effectuer la détection des contours sur la deuxième image, on peut réutiliser les mêmes paramètres de détection définis précédemment. Cette technique, appliquée à plusieurs images, permet de répéter la même analyse et de faciliter les comparaisons.
# Apply the same contour detection to the second image
contour_results2 = sigima.proc.image.contour_shape(img2, contour_param)
print("✓ Contour detection completed for second image")
contour_df2 = contour_results2.to_dataframe()
print("\nDetected contours data frame (Image 2):")
print(contour_df2)
✓ Contour detection completed for second image
Detected contours data frame (Image 2):
roi_index x y r
0 0 599.872929 554.557532 437.578594
1 0 594.996655 555.561681 404.477426
2 0 599.469649 553.896986 363.131735
3 0 594.604309 555.225095 321.693888
Extraire le profil de la deuxième image et comparer les deux profils#
On peut extraire le profil d’intensité horizontal de la deuxième image en réutilisant les paramètres d’extraction définis précédemment.
# Extract horizontal profile from second image
profile_signal2 = sigima.proc.image.line_profile(img2, profile_param)
print(f"\n✓ Profile extracted from second image: {len(profile_signal2.y)} points")
print(f"Intensity range: {profile_signal2.y.min():.1f} - {profile_signal2.y.max():.1f}")
# Compare profiles from both images
viz.view_curves(
[profile_signal1, profile_signal2],
title="Intensity Profile Comparison",
xlabel="Position (pixels)",
ylabel="Intensity",
)
✓ Profile extracted from second image: 919 points
Intensity range: 19.0 - 73.0