偏振去雾算法matlab
时间: 2023-10-16 11:16:17 浏览: 235
效果非常好的去雾算法MATLAB
4星 · 用户满意度95%
以下是一种基于偏振的去雾算法的 Matlab 实现代码:
```matlab
function [J, T] = polarization_dehaze(I, omega, radius)
% I: 输入图像,RGB格式,范围[0, 1]
% omega: 光度学大气散射参数,范围[0, 1]
% radius: 滤波器半径,控制滤波器大小
if ~exist('omega', 'var')
omega = 0.95;
end
if ~exist('radius', 'var')
radius = 15;
end
% 把图像转化为灰度图像
Igray = rgb2gray(I);
% 计算图像的梯度
[Ix, Iy] = gradient(double(Igray));
% 计算每个像素点的偏振角度
theta = atan2(Iy, Ix);
% 计算每个像素点的偏振强度
S = sqrt(Ix.^2 + Iy.^2);
% 计算偏振强度的平均值和标准差
S_mean = mean(S(:));
S_std = std(S(:));
% 计算滤波器大小
alpha = (1 - omega) / omega;
sigma = alpha * S_mean + S_std;
% 构造高斯滤波器
h = fspecial('gaussian', [radius*2+1, radius*2+1], sigma);
% 对偏振角度进行滤波
theta_f = imfilter(theta, h, 'replicate');
% 计算偏振角度的方差
theta_var = var(theta_f(:));
% 计算透射率
T = exp(-omega * S ./ max(S_mean, S_std) .* tan(theta_f - theta).^2 / theta_var);
% 限制透射率的范围
T = max(min(T, 1), 0);
% 进行去雾处理
J = (I - omega) ./ max(T, omega) + omega;
% 限制输出图像的范围
J = max(min(J, 1), 0);
end
```
使用方法:
```matlab
I = imread('hazy_image.png');
I = im2double(I);
[J, T] = polarization_dehaze(I);
imshow(J);
```
其中,`I` 是输入图像,需要先使用 `imread` 函数读取,然后使用 `im2double` 函数将其转化为范围在 [0, 1] 的 double 类型图像。`J` 是去雾后的图像,`T` 是计算出的透射率。最后使用 `imshow` 函数显示去雾后的图像。
阅读全文