إزالة الضباب من الصورة باستخدام MATLAB
إزالة الضبابية من الصورة – خوارزمية ريتينكس
1. مقدمة البرنامج التعليمي
في مجال الرؤية الحاسوبية، يعد إزالة الضبابية من الصور مهمة معالجة مسبقة مهمة، خاصة في القيادة الذاتية وتحليل الصور عن بعد وأنظمة المراقبة. يمكن أن يؤدي إزالة الضباب إلى تحسين جودة الصورة بشكل فعال وجعل الهدف أكثر وضوحًا.يستخدم هذا المشروع خوارزمية Retinex لإزالة الضبابية من الصور ويجمعها مع تسريع وحدة معالجة الرسوميات لتحسين الكفاءة الحسابية.
يستخدم هذا البرنامج التعليمي MATLAB كصورة للبرنامج وRTX 4090 كمورد للحوسبة.
2. الأساس النظري
مبدأ خوارزمية ريتينكس
Retinex (Retina + Cortex) هي خوارزمية لتحسين الصورة اقترحها لاند وماكان، والتي تعتمد بشكل أساسي على قدرة النظام البصري البشري على التكيف مع تغيرات السطوع. الفكرة الأساسية لخوارزمية Retinex هي:
- تحليل الانعكاسات والإضاءة:تتكون الصورة I(x, y) من الإضاءة L(x, y) والانعكاسية R(x, y)، أي: I(x, y) = R(x, y) * L(x, y)
- التحويل اللوغاريتمي:لإزالة تأثير الإضاءة، خذ اللوغاريتم: log I(x, y) = log R(x, y) + log L(x, y)
- إضاءة سلسة:استخدم مرشح غاوسي G(x, y) لتقدير مكون الإضاءة: L'(x, y) = G(x, y) * I(x, y)
- حساب مخرجات Retinex: R'(x, y) = log I(x, y) – log L'(x, y) من خلال هذه الطريقة، يمكن تحسين تباين الصورة مع تقليل تأثير الإضاءة.
3. خطوات التشغيل
1. التحضير للعملية
بعد استنساخ الحاوية وبدء تشغيلها بنجاح، افتح مساحة العمل.
- صورة البرنامج هي MATLAB، ومورد الحوسبة هو RTX 4090، وطريقة الوصول هي "مساحة العمل".

2. تحميل الصورة
ابحث عن "Matlab" في "Console" في "Workspace" وأدخل الكود التالي:
(يوفر هذا البرنامج التعليمي صورة نموذجية "1.png" في الدليل الرئيسي، فقط أدخل الكود)
f = imread('1.png');
imshow(f);
title('原始图像');


3. قم بتشغيل خوارزمية إزالة الضباب
تنفيذ الكود (تم إعداد ملف الكود RemoveFogByRetinex.m وحفظه في الدليل الرئيسي، ويمكن استخدامه وتشغيله مباشرة في الخطوة التالية)
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. قم بتشغيل عملية إزالة الضباب
واصل إدخال الأمر التالي في وحدة التحكم "Matlab" لتشغيل عملية إزالة الضباب:
In = RemoveFogByRetinex(f, 1);

5. تعزيز التباين بشكل أكبر
استمر في إدخال الأمر التالي في وحدة التحكم Matlab لتحسين التباين بشكل أكبر:
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);
