MATLAB を使用した画像のかすみ除去
画像のかすみ除去 – Retinex アルゴリズム
1. チュートリアルの概要
コンピューター ビジョンの分野では、画像のかすみ除去は、特に自動運転、リモート センシング画像分析、監視システムにおいて重要な前処理タスクです。かすみ除去により、画像の品質が効果的に向上し、対象物をより鮮明に見ることができます。このプロジェクトでは、画像のかすみ除去に Retinex アルゴリズムを使用し、これを GPU アクセラレーションと組み合わせて計算効率を向上させます。
このチュートリアルでは、ソフトウェア イメージとして MATLAB を使用し、コンピューティング リソースとして RTX 4090 を使用します。
2. 理論的根拠
Retinexアルゴリズムの原理
Retinex (Retina + Cortex) は、Land と McCann によって提案された画像強調アルゴリズムであり、主に人間の視覚システムの明るさの変化への適応性に基づいています。 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」を見つけて、次のコードを入力します。
(このチュートリアルでは、ホームディレクトリにサンプル画像「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);
