Bildentnebelung Mit MATLAB
Bildentnebelung – Retinex-Algorithmus
1. Einführung in das Tutorial
Im Bereich der Computervision ist die Bildentnebelung eine wichtige Vorverarbeitungsaufgabe, insbesondere beim autonomen Fahren, der Fernerkundungsbildanalyse und bei Überwachungssystemen. Durch die Entfernung von Dunst kann die Bildqualität effektiv verbessert und das Ziel deutlicher sichtbar gemacht werden.Dieses Projekt verwendet den Retinex-Algorithmus zur Bildentnebelung und kombiniert ihn mit GPU-Beschleunigung, um die Rechenleistung zu verbessern.
Dieses Tutorial verwendet MATLAB als Software-Image und RTX 4090 als Rechenressource.
2. Theoretische Grundlagen
Prinzip des Retinex-Algorithmus
Retinex (Retina + Cortex) ist ein von Land und McCann vorgeschlagener Bildverbesserungsalgorithmus, der hauptsächlich auf der Anpassungsfähigkeit des menschlichen Sehsystems an Helligkeitsänderungen basiert. Die Kernidee des Retinex-Algorithmus ist:
- Zerlegung von Reflexionen und Beleuchtung:Das Bild I(x, y) besteht aus der Beleuchtung L(x, y) und der Reflektivität R(x, y), d.h.: I(x, y) = R(x, y) * L(x, y)
- Logarithmische Transformation: Um den Beleuchtungseffekt zu eliminieren, berechnen Sie den Logarithmus: log I(x, y) = log R(x, y) + log L(x, y)
- Sanfte Beleuchtung: Verwenden Sie den Gauß-Filter G(x, y), um die Beleuchtungskomponente zu schätzen: L'(x, y) = G(x, y) * I(x, y)
- Berechnen Sie die Retinex-Ausgabe: R'(x, y) = log I(x, y) – log L'(x, y) Durch diese Methode kann der Kontrast des Bildes verbessert und gleichzeitig der Einfluss der Beleuchtung reduziert werden.
3. Bedienungsschritte
1. Vorbereitung für den Betrieb
Öffnen Sie nach dem Klonen und erfolgreichen Starten des Containers den Arbeitsbereich.
- Das Software-Image ist MATLAB, die Rechenressource ist RTX 4090 und die Zugriffsmethode ist „Workspace“.

2. Laden des Bildes
Suchen Sie in der „Konsole“ des „Arbeitsbereichs“ nach „Matlab“ und geben Sie den folgenden Code ein:
(Dieses Tutorial hat ein Beispielbild „1.png“ im Home-Verzeichnis bereitgestellt, geben Sie einfach den Code ein)
f = imread('1.png');
imshow(f);
title('原始图像');


3. Führen Sie den Dehazing-Algorithmus aus
Code-Implementierung (die Codedatei RemoveFogByRetinex.m wurde vorbereitet und im Home-Verzeichnis gespeichert und kann im nächsten Schritt direkt verwendet und ausgeführt werden)
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. Führen Sie den Entnebelungsprozess durch
Geben Sie weiterhin den folgenden Befehl in die „Matlab“-Konsole ein, um den Dehazing-Prozess auszuführen:
In = RemoveFogByRetinex(f, 1);

5. Den Kontrast weiter verbessern
Um den Kontrast weiter zu erhöhen, geben Sie weiterhin den folgenden Befehl in die Matlab-Konsole ein:
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);
