TP1: Pipeline de traitement d'image (RAW vers JPEG) (English version) Posez une question !

HW1: Building a Simple Camera Pipeline (RAW to JPEG) (Version française) Ask a question!

Camera pipeline teaser

Petit cours d'histoire

Lorsque vous appuyez sur le déclencheur d'un appareil photo numérique, le capteur ne capture pas directement une image couleur. En réalité, chaque pixel n'enregistre qu'un seul canal de couleur (rouge, vert ou bleu) à travers une matrice de filtres de couleur — le plus souvent le motif de Bayer, inventé par l'ingénieur de Kodak Bryce Bayer en 1976. Le processeur interne de l'appareil reconstruit ensuite l'image couleur complète à travers une série d'opérations collectivement appelées le « pipeline de l'appareil photo ».

Les photographes professionnels contournent souvent ce traitement interne en photographiant en format RAW, qui préserve les données brutes du capteur. Cela leur donne un contrôle plus grand sur le dématriçage, la balance des blancs, les courbes de tons et d'autres décisions créatives. Comprendre ce pipeline est fondamental en photographie computationnelle et en traitement d'images.

Brief History Lesson

When you press the shutter button on a digital camera, the sensor doesn't actually capture a color image directly. Instead, each pixel records only one color channel (red, green, or blue) through a color filter array—most commonly the Bayer pattern invented by Kodak engineer Bryce Bayer in 1976. The camera's internal processor then reconstructs the full-color image through a series of operations collectively known as the "camera pipeline."

Professional photographers often bypass this internal processing by shooting in RAW format, which preserves the original sensor data. This gives them better control over demosaicking, white balance, tone curves, and other creative decisions. Understanding this pipeline is fundamental to computational photography and image processing.

Survol

Le but de ce travail est d'implémenter un pipeline simplifié de traitement d'image qui convertit des données brutes de capteur (RAW) en une image JPEG affichable. Vous devrez :

  1. Charger un fichier image RAW (format .DNG)
  2. Dématricer le motif de Bayer pour reconstruire les valeurs RGB
  3. Appliquer une correction de balance des blancs
  4. Compresser la plage dynamique de l'image pour l'affichage
  5. Encoder le résultat final et analyser les artéfacts de profondeur de bits
Important : Ce travail comporte des exigences différentes pour les étudiants de premier cycle (GIF-4105) et des cycles supérieurs (GIF-7105). Ces différences sont clairement indiquées tout au long de l'énoncé avec des badges de couleur.

Overview

The goal of this homework is to implement a simplified camera processing pipeline that converts RAW sensor data into a displayable JPEG image. You will:

  1. Load a RAW image file (.DNG format)
  2. Demosaic the Bayer pattern to reconstruct RGB values
  3. Apply white balance correction
  4. Compress the dynamic range of the image for display
  5. Encode the final result
Important: This assignment has different requirements for undergraduate (GIF-4105) and graduate (GIF-7105) students. These differences are clearly marked throughout with color-coded badges.

Détails

Votre programme doit prendre en entrée un répertoire contenant des fichiers DNG et produire une image JPEG traitée pour chacune des entrées, avec des résultats intermédiaires sauvegardés en TIFF 16 bits, et affichés dans votre rapport en format JPG à chaque étape.

Pour chaque section de ce travail, veuillez indiquer si vous avez utilisé un modèle de langage (LLM) et, si oui, le prompt exact que vous avez utilisé ainsi qu'un résumé dans vos mots de l'approche employée dans votre remise. Si vous n'avez pas utilisé de LLM pour une section, veuillez résumer votre approche en un court paragraphe.
Données requises : Téléchargez ces images, la plupart provenant du jeu de données MIT-Adobe FiveK.
Code de départ : Pour vous aider à démarrer, nous vous fournissons un squelette de code qui implémente un pipeline de base fonctionnel. Clonez le dépôt GitHub : https://github.com/lvsn/PhotoAlgo-TP1/. Ce code de départ implémente quelques fonctionnalités du pipeline, notamment la balance des blancs de la caméra et des conversions d'espace de couleur. Vous devez compléter les parties manquantes.

1. Chargement et compréhension des données RAW 10%

Section 1 example

Lecture des fichiers DNG

DNG (Digital Negative) est le format RAW ouvert d'Adobe. Votre première tâche est de charger les données brutes du capteur à partir d'un fichier DNG. Le code de départ effectue cette section en entier pour vous dans la fonction process_dng_files().

Métadonnées extraites du fichier DNG :
  • L'arrangement du motif de Bayer (RGGB, BGGR, GRBG, ou GBRG); Faites attention, chaque image peut avoir un arrangement différent!
  • La profondeur de bits du capteur
  • Les valeurs de niveau de noir (black level) et de niveau de blanc (white level)
  • Les multiplicateurs de balance des blancs disponibles dans les métadonnées
Normalisation requise :

Normalisez les données brutes en valeurs à virgule flottante dans l'intervalle [0, 1], en tenant compte de la soustraction du niveau de noir :

image_normalized = (image_raw - black_level) / (white_level - black_level)

Ces valeurs sont disponibles dans les métadonnées du fichier DNG. Avec rawpy, ces valeurs sont disponibles dans les attributs black_level_per_channel et camera_white_level_per_channel.

L'image est enregistrée en tiff 16 bits, ainsi que la matrice RGB-XYZ (rgb_xyz_matrix) et camera_whitebalance (camera_whitebalance) sont enregistrées dans un fichier de métadonnées en format JSON.

Figures requises dans votre rapport :
  • Créez une figure avec un zoom montrant une région 16×16 de l'image mosaïque brute (une région intéressante de votre choix)
  • Rapportez les valeurs de métadonnées extraites de vos images de test

Discussion requise : Veuillez discuter brièvement des résultats obtenus dans cette section.

2. Dématriçage 30% (GIF-4105) 25% (GIF-7105)

Section 2 example

Le dématriçage (aussi appelé debayering) reconstruit l'image RGB complète à partir de la mosaïque Bayer mono-canal. Puisque chaque pixel n'enregistre qu'une seule couleur, les deux autres doivent être interpolées à partir des pixels voisins.

Prenez la sortie de la section 1 et applquez-y les algorithmes suivants.

A) Interpolation bilinéaire 5%

Interpoler les valeurs de couleur manquantes en utilisant la moyenne des pixels voisins de la même couleur. Par exemple, pour trouver la valeur rouge à un pixel d'une autre couleur, faites la moyenne des quatre voisins rouges diagonaux. Implémentez votre code dans la fonction demosaic_bilinear().

B) Méthode Malvar-He-Cutler (2004) 25% (GIF-4105) 20% (GIF-7105)

Cette interpolation corrigée par gradient améliore l'interpolation bilinéaire en utilisant l'information sur les contours. Implémentez l'algorithme tel que décrit dans :

  • Malvar, He, and Cutler, "High-Quality Linear Interpolation for Demosaicing of Bayer-Patterned Color Images," ICASSP 2004
  • Référence : Malvar He Cutler 2004

Utilisez les poids d'interpolation décrits dans la Fig. 2 de la référence. Implémentez votre code dans la fonction demosaic_malvar().

Comparaison requise :
  • Comparez les résultats de l'interpolation bilinéaire et Malvar-He-Cutler visuellement
  • Montrez des régions zoomées mettant en évidence les différences, surtout aux contours et textures fines
Figures requises dans votre rapport :
  • Comparaison côte à côte de bilinéaire vs Malvar-He-Cutler
  • Recadrages zoomés montrant les artéfacts de contour (artéfacts de fermeture éclair, franges de couleur)
Exemple de résultat attendu :

Section 2 example output

Assurez-vous que vos résultats ressemblent à cette image de référence.

Discussion requise : Veuillez discuter brièvement des résultats obtenus dans cette section.

3. Balance des blancs 20% (GIF-4105) 15% (GIF-7105)

Section 3 example

Les images RAW capturent la couleur réelle de la lumière atteignant le capteur, qui varie dramatiquement selon la source d'éclairage. La balance des blancs ajuste les canaux RGB pour que les objets neutres apparaissent neutres dans l'image finale.

Appliquez cette balance des blancs sur l'image produite par un des algorithmes de la section précédente de votre choix. Nous vous recommandons de prendre Malvar-He-Cutler.

A) Sélection automatique de région neutre 10%

Implémentez dans find_neutral_region() un algorithme qui trouve automatiquement une région « neutre » dans l'image. L'idée est de chercher des régions qui sont à la fois lumineuses et neutres (faible écart-type entre les canaux R, G, B).

Algorithme suggéré :

  1. Parcourez l'image par pas réguliers (ex: 20 pixels)
  2. Pour chaque région de taille fixe (ex: 11×11 pixels), calculez :
    • La luminosité moyenne : luminosité = 0.299×R + 0.587×G + 0.114×B
    • La neutralité : neutralité = 1 / (1 + écart_type(R, G, B) × 10)
    • Le score combiné : score = luminosité × neutralité
  3. Gardez la région avec le meilleur score (si luminosité > 0.2)
  4. Utilisez cette région pour calculer les multiplicateurs de correction :
    • multiplicateur_R = gris_cible / moyenne_R_dans_région
    • multiplicateur_G = gris_cible / moyenne_G_dans_région
    • multiplicateur_B = gris_cible / moyenne_B_dans_région

Appliquez ces multiplicateurs à l'image entière dans la fonction white_balance_auto_neutral().

B) Algorithme Grey World 10%

Implémentez dans white_balance_grey_world() la balance des blancs automatique basée sur l'hypothèse du grey world : la couleur moyenne d'une scène devrait être un gris neutre.

  • Calculez la moyenne de chaque canal sur l'image entière
  • Mettez à l'échelle chaque canal pour que toutes les moyennes soient égales (typiquement à la moyenne du canal vert)
C) Balance des Blancs proposée par la caméra

La caméra peut proposer une balance des blancs automatique basée sur les métadonnées de l'image. Employez cette valeur (camera_whitebalance dans RawPy) pour appliquer une balance des blancs automatique. Note : Le code de départ fourni implémente déjà cette fonctionnalité dans white_balance_camera().

  • Multipliez les 3 premières valeurs de camera_whitebalance par chacun des canaux de l'image pour appliquer une balance des blancs automatique.
Post-traitement

La sortie de cette étape doit être en espace XYZ. Pour ce faire, prenez vos valeurs de sortie en A), B), et C) et multipliez-les par la matrice RGB-XYZ (rgb_xyz_matrix) pour obtenir la sortie en espace XYZ.

Note sur les espaces de couleur : Après le dématriçage, l'espace de couleur est "RGB de la caméra", qui n'est pas un espace standard. Le manufacturier donne la matrice de conversion vers XYZ, et après on peut convertir en ce qu'on veut (sRGB dans ce cas-ci). Le code de démarrage vous offre cette fonctionalité dans camera_rgb_to_xyz().

Figures requises dans votre rapport :
  • Image originale sans correction de balance des blancs
  • Résultats de la sélection automatique de région neutre (montrez la région sélectionnée)
  • Résultats de l'algorithme Grey World
  • Résultats de la balance des blancs proposée par la caméra
Exemple de résultat attendu :

Section 3 example output

Assurez-vous que vos résultats ressemblent à cette image de référence.

Discussion requise : Veuillez discuter brièvement des résultats obtenus dans cette section.

4. Mappage tonal et enregistrement 25% (GIF-4105) 20% (GIF-7105)

Section 4 example

Après le dématriçage et la balance des blancs, vous avez une image RGB linéaire en espace XYZ. Cependant, cette image n'est pas encore prête à être affichée — elle nécessite un mappage tonal pour compresser la plage dynamique et un encodage de fonction de transfert pour un affichage correct.

A) Ajustement de luminosité

Avant de commencer le mappage tonal, appliquez un ajustement de luminosité à votre image. Implémentez votre algorithme dans adjust_brightness pour régler la luminosité de l'image. Utilisez l'algorithme de votre choix, par exemple mesurez le 99e percentile d'intensité de l'image, et divisez l'image par cette valeur.

B) Mappage tonal global

Implémentez les opérateurs globaux suivants :

1. Linéaire (tonemap_linear()):

Aucune courbe n'est appliquée: $L_{out} = L_{in}$.

2. Opérateur global de Reinhard (de "Photographic Tone Reproduction for Digital Images", (tonemap_reinhard())) :

$L_{out} = \frac{L_{in}}{1 + L_{in}}$

Cette formule simple compresse naturellement les hautes lumières tout en préservant les détails dans les ombres.

C) Conversion XYZ vers sRGB (xyz_to_linear_srgb())

Convertissez votre image en espace XYZ vers sRGB en utilisant la matrice de conversion sRGB :

$$\begin{bmatrix} R \\ G \\ B \end{bmatrix} = \begin{bmatrix} 3.2406255, -1.5372080, -0.4986286 \\ -0.9689307, 1.8757561, 0.0415175 \\ 0.0557101, -0.2040211, 1.0569959 \end{bmatrix} \begin{bmatrix} X \\ Y \\ Z \end{bmatrix} $$

D) OETF sRGB (encodage d'affichage, linear_to_srgb())

Après le mappage tonal, appliquez la fonction de transfert sRGB pour un encodage d'affichage correct :

  • Si linéaire ≤ 0.0031308 : sRGB = 12.92 × linéaire
  • Sinon : sRGB = 1.055 × linéaire^(1/2.4) − 0.055

Votre image est maintenant prête à être affichée à l'écran! L'étape finale est de quantifier votre image traitée à 8 bits et de l'enregistrer en JPEG.

E) Artéfacts de compression JPEG
  • Sauvegardez votre image en JPEG à différents niveaux de qualité (par exemple, 95, 75, 50, 25) et comparez-le avec l'image enregistrée en format PNG (sans perte de compression)
  • Visualisez les artefacts de compression à chaque niveau
F) Limitations de la plage dynamique
  • Discutez de comment la sortie 8 bits limite la plage dynamique affichable comparée aux données RAW originales et de l'impact du mappage tonal sur la plage dynamique
  • Montrez des exemples d'écrêtage des hautes lumières ou d'écrasement des ombres qui pourraient être évités avec une sortie HDR
Figures requises dans votre rapport :
  • Comparaison des différents opérateurs de mappage tonal global sur la même image
  • Avant/après l'application de l'OETF
  • Artefacts JPEG à différents niveaux de qualité
  • Graphique comparant taille de fichier vs qualité
Exemple de résultat attendu :

Section 4 example output

Assurez-vous que vos résultats ressemblent à cette image de référence.

Discussion requise : Veuillez discuter brièvement des résultats obtenus dans cette section.

5. Exigences supplémentaires pour les cycles supérieurs

Les sections suivantes sont OBLIGATOIRES pour les étudiants aux cycles supérieurs (maîtrise/doctorat) :

Réduction du bruit 5%

Les images RAW, surtout à ISO élevé, contiennent un bruit significatif. Implémentez une étape de débruitage dans votre pipeline :

  • Appliquez le débruitage tout de suite après le dématriçage
  • Implémentez au moins une méthode :
    • Au moins une méthode simple, telle le filtrage Gaussien
    • Au moins une méthode avancée, telle le filtre bilatéral, les moyennes non locales, ou un débruiteur appris par intelligence artificielle
  • Montrez les résultats avant/après et discutez du compromis bruit vs détail

Discussion requise : Veuillez discuter brièvement des résultats obtenus dans cette section.

Note : Les étudiants de premier cycle (GIF-4105) peuvent réaliser la section 5 (Réduction du bruit) pour des crédits supplémentaires (voir section Crédits supplémentaires).

6. Vos propres images RAW 15%

Traitez vos propres images à travers votre pipeline complet. La plupart des smartphones sont maintenant capables de photographier en DNG. Si vous n'êtes pas sûr de comment faire, vous pouvez utiliser l'application gratuite Lightroom tel qu'expliqué dans ce document.

  • Capturez au moins 3 scènes différentes avec des conditions d'éclairage variées
  • Documentez les détailsde votre appareil/capteur
  • Montrez des comparaisons avant/après complètes à travers votre pipeline

Details

Your program should take as input a DNG file and output a processed JPEG image, with intermediate results saved as 16-bit TIFF, and displayed in your report as JPG at each stage.

For each section of this assignment, please indicate whether you used a Large Language Model (LLM) and, if so, the exact prompt you used as well as a summary in your own words of the approach you employed in your submission. If you did not use an LLM for a section, please summarize your approach in a short paragraph.
Required Data: Download these images, most of them coming from the MIT-Adobe FiveK dataset.
Starter Code: To help you get started, we provide a skeleton code that implements a basic working pipeline. Clone the GitHub repository: https://github.com/lvsn/PhotoAlgo-TP1/. This starter code implements parts of the homework such as the camera's predefined white balance, some colorspace conversions, and more. You must complete the missing parts.

1. Loading and Understanding RAW Data 10%

Section 1 example

Reading DNG Files

DNG (Digital Negative) is Adobe's open RAW format. Your first task is to load the raw sensor data from a DNG file. The starter code implements this entire section for you in the process_dng_files() function.

What is extracted from the DNG file:
  • The Bayer pattern arrangement (RGGB, BGGR, GRBG, or GBRG); Be careful, each image may have a different arrangement!
  • The bit depth of the sensor (typically 12-14 bits)
  • Black level (black level) and white level (white level) values
  • Any available white balance multipliers stored in metadata
Required Normalization:

The raw data is normalized to floating-point values in [0, 1] range, accounting for black level subtraction:

normalized = (raw_value - black_level) / (white_level - black_level)

These values are available in the DNG file metadata. With rawpy, these values are available in the black_level_per_channel and camera_white_level_per_channel attributes.

The image is saved as a 16-bit TIFF, and the RGB-XYZ matrix (rgb_xyz_matrix), color_matrix (color_matrix), and camera_whitebalance (camera_whitebalance) are saved in a metadata file in JSON format.

Required Figures in Your Report:
  • Create a figure with a zoom-in showing a 16×16 region of the raw mosaic image (any interesting region of your choosing)
  • Document the metadata values extracted from your test images

Required Discussion: Please discuss briefly the results obtained in this section.

2. Demosaicking 30% (GIF-4105) 25% (GIF-7105)

Section 2 example

Demosaicking (also called debayering) reconstructs the full RGB image from the single-channel Bayer mosaic. Since each pixel only records one color, the other two must be interpolated from neighboring pixels.

Take the output from Section 1 and apply the following algorithms to it.

A) Bilinear Interpolation 5%

In demosaic_bilinear(), interpolate missing color values using the average of neighboring pixels of the same color. For example, to find the red value at a blue pixel, average the four diagonal red neighbors. Implement your code in

B) Malvar-He-Cutler (2004) Method 25% (GIF-4105) 20% (GIF-7105)

This gradient-corrected interpolation improves upon bilinear by using edge information. Implement in demosaic_malvar the algorithm as described in:

  • Malvar, He, and Cutler, "High-Quality Linear Interpolation for Demosaicing of Bayer-Patterned Color Images," ICASSP 2004
  • Reference: Malvar He Cutler 2004

Implement the interpolation weights described in Fig. 2 of the reference.

Required Comparison:
  • Compare results from bilinear interpolation and Malvar-He-Cutler visually
  • Show zoomed-in regions highlighting differences, especially at edges and fine textures
Required Figures in Your Report:
  • Side-by-side comparison of bilinear vs. Malvar-He-Cutler
  • Zoomed crops showing edge artifacts (zipper artifacts, color fringing)
Expected Result Example:

Section 2 example output

Make sure your results look similar to this reference image.

Required Discussion: Please discuss briefly the results obtained in this section.

3. White Balancing 20% (GIF-4105) 15% (GIF-7105)

Section 3 example

RAW images capture the actual color of light hitting the sensor, which varies dramatically based on the illumination source. White balancing adjusts the RGB channels so that neutral objects appear neutral in the final image.

Apply this white balance to the image produced by one of the algorithms from the previous section of your choice. We recommend using Malvar-He-Cutler.

A) Automatic Neutral Region Selection 10%

Implement an algorithm that automatically finds a "neutral" region in the image. The idea is to search for regions that are both bright and neutral (low standard deviation between R, G, B channels). Implement your algorithm in find_neutral_region().

Suggested algorithm:

  1. Scan the image at regular intervals (e.g., every 20 pixels)
  2. For each region of fixed size (e.g., 11×11 pixels), compute:
    • Average brightness: brightness = 0.299×R + 0.587×G + 0.114×B
    • Neutrality score: neutrality = 1 / (1 + std(R, G, B) × 10)
    • Combined score: score = brightness × neutrality
  3. Keep the region with the best score (if brightness > 0.2)
  4. Use this region to compute the correction multipliers:
    • multiplier_R = target_grey / average_R_in_region
    • multiplier_G = target_grey / average_G_in_region
    • multiplier_B = target_grey / average_B_in_region

Apply these multipliers to the entire image in white_balance_auto_neutral().

B) Grey World Algorithm 10%

Implement automatic white balance based on the grey world assumption: the average color of a scene should be neutral grey. Implement your algorithm in white_balance_grey_world().

  • Compute the mean of each channel across the entire image
  • Scale each channel so that all means are equal (typically to the green channel mean)
C) White Balance proposed by the camera

The camera may propose an automatic white balance based on the image metadata. Use this value (camera_whitebalance in rawpy) to apply an automatic white balance. Note: The provided starter code already implements this functionality in white_balance_camera().

  • Multiply the first 3 values of camera_whitebalance by each channel of the image to apply an automatic white balance.
Post-processing

The output of this step should be in XYZ color space. To do this, take your output values from A), B), and C) and multiply them by the RGB-XYZ matrix (rgb_xyz_matrix) to obtain the output in XYZ color space. The starter code implements this functionality in camera_rgb_to_xyz().

Note on color spaces: After demosaicking, the color space is "camera RGB", which is not a standard space. The manufacturer provides the conversion matrix to XYZ, and then we can convert to whatever we want (sRGB in this case).

Required Figures in Your Report:
  • Original image without white balance correction
  • Results from automatic neutral region selection (show the selected region)
  • Results from grey world algorithm
  • Results from the camera-proposed white balance
Expected Result Example:

Section 3 example output

Make sure your results look similar to this reference image.

Required Discussion: Please discuss briefly the results obtained in this section.

4. Tone Mapping and Saving 25% (GIF-4105) 20% (GIF-7105)

Section 4 example

After demosaicking and white balancing, you have a linear RGB image in XYZ color space. However, this image is not yet ready to be displayed—it needs tone mapping to compress the dynamic range and transfer function encoding for proper display.

A) Brightness Adjustment

Before starting tone mapping, apply a brightness adjustment to your image. This allows you to set the image brightness correctly. Use an algorithm of your choice, for example measure the 99th percentile of image intensity, and divide the image by this value. Implement your algorithm in adjust_brightness().

B) Global Tone Mapping

Implement the following global operators:

1. Linear (tonemap_linear()):

No curve is applied: $L_{out} = L_{in}$.

2. Reinhard Global Operator (from "Photographic Tone Reproduction for Digital Images", tonemap_reinhard()):

$L_{out} = \frac{L_{in}}{1 + L_{in}}$

This simple formula naturally compresses highlights while preserving shadow detail.

C) XYZ to sRGB Conversion (xyz_to_linear_srgb())

Convert your image from XYZ color space to sRGB using the sRGB conversion matrix:

$$\begin{bmatrix} R \\ G \\ B \end{bmatrix} = \begin{bmatrix} 3.2406255, -1.5372080, -0.4986286 \\ -0.9689307, 1.8757561, 0.0415175 \\ 0.0557101, -0.2040211, 1.0569959 \end{bmatrix} \begin{bmatrix} X \\ Y \\ Z \end{bmatrix} $$

D) sRGB OETF (Display Encoding, linear_to_srgb())

After tone mapping, apply the sRGB transfer function for proper display encoding:

  • If linear ≤ 0.0031308: sRGB = 12.92 × linear
  • Else: sRGB = 1.055 × linear^(1/2.4) − 0.055

Your image is now ready to be displayed on screen! The final step is to quantize your processed image to 8 bits and save it as JPEG.

E) JPEG Compression Artifacts
  • Save your image as JPEG at different quality levels (e.g., 95, 75, 50, 25) and compare it with the image saved in PNG format (lossless compression)
  • Visualize the compression artifacts at each level
F) Dynamic Range Limitations
  • Discuss how the 8-bit output limits the displayable dynamic range compared to the original RAW data and the impact of tone mapping on dynamic range
  • Show examples of highlight clipping or shadow crushing that could be avoided with HDR output
Required Figures in Your Report:
  • Comparison of different global tone mapping operators on the same image
  • Before/after OETF application
  • JPEG artifacts at various quality levels
  • File size vs. quality comparison chart
Expected Result Example:

Section 4 example output

Make sure your results look similar to this reference image.

Required Discussion: Please discuss briefly the results obtained in this section.

5. Graduate Student Additional Requirements

The following sections are MANDATORY for graduate students (Masters/PhD):

Noise Reduction 5%

RAW images, especially at high ISO, contain significant noise. Implement a denoising step in your pipeline:

  • Apply denoising right after demosaicking
  • Implement: least one method: bilateral filter, non-local means, or a simple learned denoiser
    • At least one simple method, such as Gaussian filtering
    • At least one advanced method, such as bilateral filter, Non-local means, or a learned denoiser
  • Show before/after results and discuss the noise vs. detail tradeoff

Required Discussion: Please discuss briefly the results obtained in this section.

Note: Undergraduate students (GIF-4105) may complete Section 5 (Noise Reduction) for extra credit (see Extra Credit section).

6. Your Own RAW Images 15%

Process your own images through your complete pipeline. Most cellphones are now capable of shooting DNG. If you're unsure about how to do this, you can use the free Lightroom application as explained in this document.

Capture your own RAW photos and process them:

  • Capture at least 3 different scenes with varying lighting conditions
  • Document the details of your camera/sensor
  • Show complete before/after comparisons through your pipeline
Important Rule: You may not use functions that already implement what you're supposed to implement. For example, complete demosaicking functions from libraries like rawpy.postprocess() with default parameters are not allowed (you may use it as a reference for comparison). If you're wondering which functions are ok to use (or not), ask us!

Crédits supplémentaires (jusqu'à 20% bonus)

Essayez une (ou plusieurs!) de ces idées pour approfondir vos connaissances (et bonifier votre note). Pour chaque idée, vous devez présenter les résultats obtenus et une brève discussion sur ceux-ci.

  • Comparaison avec logiciel de référence (jusqu'à 5%) : Traitez les mêmes fichiers RAW avec un outil de référence (p.ex., RawTherapee, ou Darktable) et comparez vos résultats visuellement et quantitativement (PSNR (Peak Signal-to-Noise Ratio), SSIM (Structural Similarity Index)).
  • Contrast-stretch (jusqu'à 5%) : Comparez visuellement vos résultats avec l'algorithme de contrast-stretch. Vous pouvez utiliser GIMP (Couleurs > Auto > Balance des blancs) ou ImageMagick (magick input.jpg -separate -contrast-stretch 0.5%x0.5% -combine output.jpg).
  • Différent espace de couleur de sortie (jusqu'à 10%) : Ajoutez un espace de couleur de sortie autre que sRGB, tel le rec.2020, Adobe RGB, ou autre. Discutez de comment cela affecte la précision des couleurs.
  • Mappage tonal local (jusqu'à 5%) : Implémentez un opérateur de mappage tonal local par filtre bilatéral. Décomposez l'image en couches de base (basse fréquence) et de détail (haute fréquence) en utilisant un filtre bilatéral ou guidé. Compressez la couche de base tout en préservant la couche de détail, puis recombinez. Implémentez l'une des méthodes suivantes : Durand & Dorsey, Paris & Durand, ou Fattal. Pas besoin d'afficher la courbe de cet opérateur dans votre rapport.
  • Opérateur global Filmic (jusqu'à 5%) : Implémentez l'opérateur global Filmic qui utilise une fonction sigmoïde pour compresser la plage dynamique. Comparez les résultats avec les autres opérateurs globaux (linéaire et Reinhard).
  • Dématriçage appris (jusqu'à 10%) : En plus des méthodes bilinéaire et Malvar-He-Cutler, implémentez une approche de dématriçage apprise utilisant un algorithme d'apprentissage simple. Un modèle linéaire (SGDRegressor de Scikit-Learn), un random forest regressor, ou un perceptron multicouche fonctionneront, tous disponibles dans Scikit-Learn. Documentez votre approche, vos données d'entraînement et votre processus d'entraînement.
  • Dématriçage avancé (jusqu'à 10%) : Implémentez un algorithme de dématriçage avancé supplémentaire (par exemple, Adaptive homogeneity-directed (AHD), Aliasing minimization and zipper elimination (AMaZE), ou une autre technique de votre choix.
  • Correction de l'aberration chromatique (jusqu'à 10%) : Détectez et corrigez l'aberration chromatique en utilisant un algorithme tel que Chung et al. 2010.
  • Suppression des pixels chauds (jusqu'à 5%) : Détectez et interpolez par-dessus les pixels chauds/morts qui sont courants dans les longues expositions.
  • Interface graphique complète (jusqu'à 10%) : Construisez une interface interactive qui permet l'ajustement en temps réel de la balance des blancs, des courbes de tons et d'autres paramètres avec aperçu en direct.
  • Vos propres idées (jusqu'à 10%) : Toute autre idée — demandez l'approbation de l'instructeur d'abord !

Extra Credit (up to 20% bonus)

Try one (or many!) of these ideas to increase your understanding on this subject (and your grade). For each idea, you must present the results obtained and a brief discussion on them.

  • Reference Software Comparison (up to 5%): Process the same RAW files with a reference tool (e.g., RawTherapee, or Darktable) and compare your results visually and quantitatively (PSNR (Peak Signal-to-Noise Ratio), SSIM (Structural Similarity Index)).
  • Contrast-stretch (up to 5%): Compare visually your results with the contrast-stretch algorithm. You can use GIMP (Colors > Auto > White Balance) or ImageMagick (magick input.jpg -separate -contrast-stretch 0.5%x0.5% -combine output.jpg).
  • Different Output Color Space (up to 10%): Add an output color space other than sRGB, such as rec.2020, Adobe RGB, or another. Discuss how this affects color accuracy.
  • Local Tone Mapping (up to 5%): Implement a local tone mapping operator using a bilateral filter. Decompose the image into base (low-frequency) and detail (high-frequency) layers using a bilateral or guided filter. Compress the base layer while preserving the detail layer, then recombine. Implement one of the following methods: Durand & Dorsey, Paris & Durand, or Fattal. No need to show the curve of this operator in your report.
  • Filmic Global Operator (up to 5%): Implement the Filmic global operator which uses a sigmoid function to compress the dynamic range. Compare the results with the other global operators (linear and Reinhard).
  • Learned Demosaicking (up to 10%): In addition to the bilinear and Malvar-He-Cutler methods, implement a learned demosaicking approach using a simple learning algorithm. Either a linear model (Scikit-Learn's SGDRegressor), a random forest regressor, or a multi-layer perceptron will work fine, all of them available in Scikit-Learn. Document your approach, training data, and training process.
  • Advanced Demosaicking (up to 10%): Implement an additional advanced demosaicking algorithm (e.g., Adaptive homogeneity-directed (AHD), Aliasing minimization and zipper elimination (AMaZE), or another one of your choosing).
  • Chromatic Aberration Correction (up to 10%): Detect and correct chromatic aberration using an algorithm such as Chung et al. 2010.
  • Hot Pixel Removal (up to 5%): Detect and interpolate over hot/dead pixels that are common in long exposures.
  • Complete GUI (up to 10%): Build an interactive interface that allows real-time adjustment of white balance, tone curves, and other parameters with live preview.
  • Your Own Ideas (up to 10%): Any other idea—ask the instructor for approval first!

Trucs et astuces

  • Travaillez en virgule flottante (32 bits) pour tous les calculs intermédiaires afin de préserver la précision.
  • Appliquez les opérations dans le bon ordre : soustraction du niveau de noir → dématriçage → balance des blancs → réduction du bruit → mappage tonalOETF → quantification.
  • Pour le dématriçage, gérez les bordures de l'image avec soin — vous pouvez recadrer quelques pixels ou utiliser un remplissage miroir.
  • Testez sur plusieurs images avec différents contenus (portraits, paysages, scènes à fort contraste).
  • Conservez vos résultats intermédiaires à haute profondeur de bits pour démontrer la valeur du traitement RAW.
  • L'algorithme Malvar-He-Cutler utilise des noyaux 5×5 spécifiques — implémentez-les exactement comme spécifié dans l'article.

Tips and Hints

  • Work in floating-point (32-bit) for all intermediate computations to preserve precision.
  • Apply operations in the correct order: black level subtraction → demosaicking → white balance → noise reduction → tone mappingOETF → quantization.
  • For demosaicking, handle image borders carefully—you may crop a few pixels or use mirrored padding.
  • Test on multiple images with different content (portraits, landscapes, high-contrast scenes).
  • Keep your original high-bit-depth intermediate results to demonstrate the value of RAW processing.
  • The Malvar-He-Cutler algorithm uses specific 5×5 kernels—implement these exactly as specified in the paper.

Livrables et pondération

Pour ce travail, vous devrez soumettre votre code et une page web illustrant vos résultats et contenant une courte discussion sur ceux-ci. Pour vous aider à démarrer, nous vous fournissons une ébauche de page web (facultative), et le code de démarrage vous fournit des figures. L'apparence esthétique du site Web ne sera pas évaluée, mais il est important que les informations soient clairement présentées.

Nous vous recommandons d'héberger votre rapport (sans votre code) sur un dépôt public (GitHub, GitLab, Bitbucket, etc.) comme partie de votre portfolio professionnel.

Contenu du rapport (rapport/index.html) :

Chaque section doit inclure des figures démontrant vos résultats :

SectionContenu requisPoints (GIF-4105)Points (GIF-7105)
1. Chargement RAW Visualisation du motif Bayer, documentation des métadonnées 10% 10%
2. Dématriçage Comparaison des méthodes, artéfacts zoomés, comparaison avec logiciel de référence 30% 25%
3. Balance des blancs Toutes les méthodes démontrées 20% 15%
4. Mappage tonal Comparaison des opérateurs globaux, discussion OETF avec exemples 25% 20%
5. Réduction du bruit Avant/après, comparaison avec référence 5%
6. Images personnelles Vos propres photos RAW que vous avez vous-même traitées 15%
Crédits supplémentaires Description, résultats, brève discussion pour chaque Jusqu'à 20% bonus

Deliverables and Grading

We recommend you host your report (without your code) on a public repository (GitHub, GitLab, Bitbucket, etc.) as part of your professional portfolio.

For this homework you must turn in both your code and a webpage in which you will put your results and a discussion on them. We provide you with a starter webpage, and the starter code provides some figures. The aesthetics of the website will not be evaluated, but it is important that the information be presented clearly.

Report Content (report/index.html):

Each section must include figures demonstrating your results:

SectionRequired ContentPoints (GIF-4105)Points (GIF-7105)
1. Loading RAW Bayer pattern visualization, metadata documentation 10% 10%
2. Demosaicking Comparison of methods, zoomed artifacts, reference software comparison 30% 25%
3. White Balancing All methods demonstrated 20% 15%
4. Tone Mapping Comparison of global operators, OETF discussion with examples 25% 20%
5. Noise Reduction Before/after, comparison with reference 5%
6. Personal Images Your own RAW photos processed through the pipeline 15%
Extra Credit Description, results, brief discussion for each Up to 20% bonus

Remise

Pour la remise de votre travail, créez un fichier tp1.zip qui contient :

  • Un dossier code contenant tous vos fichiers sources;
  • Un dossier report contenant votre rapport HTML (report/index.html).

Finalement, veuillez téléverser votre fichier tp1.zip sur le portail des cours avant la date limite. La politique des retards mentionnée dans le plan de cours sera appliquée. Pour toutes questions concernant la procédure de remise ou le travail lui-même, posez vos questions sur PAX!

Attention !
  • La taille limite permise sur le portail des cours est de 250MB.
  • N'incluez PAS de fichiers RAW/DNG dans votre remise.
  • N'incluez PAS les images sources utilisées pour générer vos résultats dans le dossier code.

Handing in Procedure

For this homework, you must create a tp1.zip file containing:

  • A code folder containing all source files;
  • A report folder containing your HTML report (report/index.html).

Finally, you should upload this file (tp1.zip) on the "portail des cours" before the deadline. The late submission policy described in the course plan will be applied. For any question regarding the submission process or the project as such, ask your questions on PAX!

Be careful!
  • File size limit on the "portail" is 250MB.
  • Do NOT include any RAW/DNG files in your zip file.
  • Do NOT include the source images you used to generate your results in the code folder.

Références

Si vous souhaitez approfondir vos connaissances sur le pipeline de traitement d'image des appareils photo, nous recommandons la ressource suivante :

References

If you want to deepen your understanding of camera image processing pipelines, we recommend the following resource:

Retour à la page web du cours.

Back to the class webpage.