案例演示:图像去雾

来源:互联网 发布:商务数据分析与应用 编辑:程序博客网 时间:2024/05/21 10:18

让我们从设计界面开始,演示基于图像直方图等算法的雾霾图像增强效果的编程实战。首先,上一张效果图:

          

                     

下面介绍相关算法的代码:

(1)基于暗原色的单一图像去雾算法
% 输入参数:I——图像矩阵   flag——显示标记
% 输出参数:J——结果图像

if nargin < 2
    flag = 1;
end
%每个block为15个像素
blockSize=15;w0=0.6;t0=0.1;
[h,w,s]=size(I);min_I=zeros(h,w);
for i=1:h
    for j=1:w
        dark_I(i,j)=min(I(i,j,:));
    end
end
Max_dark_channel=double(max(max(dark_I)));
dark_channel=double(dark_I);
t=1-w0*(dark_channel/Max_dark_channel);
t=max(t,t0);I1=double(I);
J(:,:,1) = imadd(im2uint8(mat2gray((I1(:,:,1) - (1-t)*Max_dark_channel)./t)), 30);
J(:,:,2) = imadd(im2uint8(mat2gray((I1(:,:,2) - (1-t)*Max_dark_channel)./t)), 30);
J(:,:,3) = imadd(im2uint8(mat2gray((I1(:,:,3) - (1-t)*Max_dark_channel)./t)), 30);
if flag
    figure;
    subplot(2, 2, 1);imshow(I);title('原始图像', 'FontWeight', 'Bold');
    subplot(2, 2, 2);imshow(J);title('去雾后的图像', 'FontWeight', 'Bold');
    Q = rgb2gray(I);M = rgb2gray(J);
    subplot(2, 2, 3); imhist(Q, 64); title('原灰度直方图', 'FontWeight', 'Bold');
    subplot(2, 2, 4); imhist(M, 64); title('处理后的灰度直方图', 'FontWeight', 'Bold');
end


(2)全局直方图算法

if nargin < 2
    flag = 1;
end
% RGB分层
R = I(:,:,1);G = I(:,:,2);B = I(:,:,3);
% 分别对每一层进行直方图均衡化增强
M = histeq(R);N = histeq(G);L = histeq(B);
% 恢复到RGB
In = cat(3, M, N, L);
if flag
    figure;
    subplot(2, 2, 1); imshow(I); title('原图像', 'FontWeight', 'Bold');
    subplot(2, 2, 2); imshow(In); title('处理后的图像', 'FontWeight', 'Bold');
    Q = rgb2gray(I);W = rgb2gray(In);
    subplot(2, 2, 3); imhist(Q); title('原灰度直方图', 'FontWeight', 'Bold');
    subplot(2, 2, 4); imhist(W); title('处理后的灰度直方图', 'FontWeight', 'Bold');
end


(3)局部增强算法

% 对RGB三层分别处理
g1 = GetLocalPrcoess(I(:, :, 1));
g2 = GetLocalPrcoess(I(:, :, 2));
g3 = GetLocalPrcoess(I(:, :, 3));
% 恢复到RGB
In = cat(3, g1, g2, g3);
if flag
    figure;
    subplot(2, 2, 1); imshow(I); title('原图像', 'FontWeight', 'Bold');
    subplot(2, 2, 2); imshow(In); title('处理后的图像', 'FontWeight', 'Bold');
    Q = rgb2gray(I);
    W = rgb2gray(In);
    subplot(2, 2, 3); imhist(Q); title('原灰度直方图', 'FontWeight', 'Bold');
    subplot(2, 2, 4); imhist(W); title('处理后的灰度直方图', 'FontWeight', 'Bold');
end

%function g = GetLocalPrcoess(I)
x=mat2gray(I);
f=im2double(x);
w=4;k=0.06;
M=mean2(f);
% 标准差
z=colfilt(f,[w w],'sliding',@std);
% 均值
m=colfilt(f,[w w],'sliding',@mean);
A=k*M./z;
g=A.*(f-m)+m;
% 数据类型标准化
g=im2uint8(mat2gray(g));


原创粉丝点击