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 ».

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('原始图像');


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);

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);
