HyperAI

Dévoilage D'images Avec MATLAB

Correction du voile d'image – Algorithme Retinex

1. Introduction au tutoriel

Dans le domaine de la vision par ordinateur, la suppression du voile d'image est une tâche de prétraitement importante, en particulier dans la conduite autonome, l'analyse d'images de télédétection et les systèmes de surveillance. Le dévoilage peut améliorer efficacement la qualité de l’image et rendre la cible plus clairement visible.Ce projet utilise l'algorithme Retinex pour la correction du voile d'image et le combine avec l'accélération GPU pour améliorer l'efficacité de calcul.

Ce tutoriel utilise MATLAB comme image logicielle et RTX 4090 comme ressource de calcul.

2. Base théorique

Principe de l'algorithme Retinex

Retinex (Retina + Cortex) est un algorithme d'amélioration d'image proposé par Land et McCann, qui repose principalement sur l'adaptabilité du système visuel humain aux changements de luminosité. L'idée centrale de l'algorithme Retinex est :

  • Réflexions et éclairages décomposés:L'image I(x, y) est constituée de l'éclairement L(x, y) et de la réflectivité R(x, y), c'est-à-dire : I(x, y) = R(x, y) * L(x, y)
  • Transformation logarithmique:Pour éliminer l'effet de l'éclairage, prenez le logarithme : log I(x, y) = log R(x, y) + log L(x, y)
  • Éclairage doux:Utilisez le filtre gaussien G(x, y) pour estimer la composante d'éclairage : L'(x, y) = G(x, y) * I(x, y)
  • Calculer la production de Retinex: R'(x, y) = log I(x, y) – log L'(x, y) Grâce à cette méthode, le contraste de l'image peut être amélioré tout en réduisant l'impact de l'éclairage.

3. Étapes de l'opération

1. Préparation à l'opération

Après avoir cloné et démarré avec succès le conteneur, ouvrez l'espace de travail.

  • L'image du logiciel est MATLAB, la ressource de calcul est RTX 4090 et la méthode d'accès est « espace de travail ».
3

2. Chargement de l'image

Recherchez « Matlab » dans la « Console » de l'« Espace de travail » et entrez le code suivant :
(Ce tutoriel a fourni un exemple d'image « 1.png » dans le répertoire personnel, entrez simplement le code)

f = imread('1.png');
imshow(f);
title('原始图像');
4
7

3. Exécutez l'algorithme de débroussaillage

Implémentation du code (le fichier de code RemoveFogByRetinex.m a été préparé et enregistré dans le répertoire personnel et peut être utilisé et exécuté directement à l'étape suivante)

function In = RemoveFogByRetinex_GPU(f, flag)
    % 启用 CUDA 前向兼容性
    parallel.gpu.enableCUDAForwardCompatibility(true);

    if nargin < 2
        flag = 1;
    end

    % 转换到 GPU
    f = gpuArray(im2double(f));

    % 拆分颜色通道
    fr = f(:, :, 1);
    fg = f(:, :, 2);
    fb = f(:, :, 3);

    % 归一化
    mr = mat2gray(fr);
    mg = mat2gray(fg);
    mb = mat2gray(fb);

    % 设置滤波参数
    alpha = 200;
    n = floor(min([size(f, 1) size(f, 2)]) * 0.5);
    n1 = floor((n + 1) / 2);

    % 创建滤波核
    [X, Y] = meshgrid(1:n, 1:n);
    b = exp(-((X - n1).^2 + (Y - n1).^2) / (4 * alpha)) / (pi * alpha);
    b = gpuArray(b);

    % 进行滤波
    nr1 = imfilter(mr, b, 'conv', 'replicate');
    ng1 = imfilter(mg, b, 'conv', 'replicate');
    nb1 = imfilter(mb, b, 'conv', 'replicate');
    

% 计算 Retinex 公式(避免 log(0) 问题)
ur1 = log(max(nr1, 0.01));  
ug1 = log(max(ng1, 0.01));
ub1 = log(max(nb1, 0.01));

tr1 = log(max(mr, 0.01));
tg1 = log(max(mg, 0.01));
tb1 = log(max(mb, 0.01));

% 计算 Retinex 输出
yr1 = tr1 - ur1;
yg1 = tg1 - ug1;
yb1 = tb1 - ub1;

% 归一化(手动调整范围)
min_val = min([min(yr1(:)), min(yg1(:)), min(yb1(:))]);
max_val = max([max(yr1(:)), max(yg1(:)), max(yb1(:))]);

yr1 = (yr1 - min_val) / (max_val - min_val);
yg1 = (yg1 - min_val) / (max_val - min_val);
yb1 = (yb1 - min_val) / (max_val - min_val);

% 转换到 uint8
cr = gather(im2uint8(yr1));
cg = gather(im2uint8(yg1));
cb = gather(im2uint8(yb1));

% 合并通道
In = cat(3, cr, cg, cb);

    % 显示结果
    if flag
        figure;
        subplot(2, 2, 1);
        imshow(gather(f)); title('原图像', 'FontWeight', 'Bold');

        subplot(2, 2, 2);
        imshow(In); title('处理后的图像', 'FontWeight', 'Bold');

        Q = rgb2gray(gather(f));
        M = rgb2gray(In);

        subplot(2, 2, 3);
        imhist(Q, 64); title('原灰度直方图', 'FontWeight', 'Bold');

        subplot(2, 2, 4);
        imhist(M, 64); title('处理后的灰度直方图', 'FontWeight', 'Bold');
    end
end

4. Exécutez le processus de désembuage

Continuez à entrer la commande suivante dans la console « Matlab » pour exécuter le processus de déparasitage :

In = RemoveFogByRetinex(f, 1);
8

5. Améliorer davantage le contraste

Continuez à entrer la commande suivante dans la console Matlab pour améliorer encore le contraste :

lab = rgb2lab(In);
L = lab(:, :, 1) / 100;
L = adapthisteq(L, 'ClipLimit', 0.02, 'Distribution', 'rayleigh');
lab(:, :, 1) = L * 100;
In = lab2rgb(lab);

In = imadjust(In, stretchlim(In, [0.01, 0.99]), []);
In = imsharpen(In, 'Radius', 2, 'Amount', 1.5);
imshow(In);
9