基于直方图均衡化的水下图像增强(MATLAB仿真)

 

可以对RGB三个通道进行直方图规定化从而实现水下图像增强。此处我们使用的是直方图均衡化,通过实际仿真效果也很明显。

前段时间一直在做去雾处理。在laviewpbt博客中对去雾算法介绍的很详细,我从暗通道算法开始学习的,后来又仿真快速去雾算法,效果都还可以。然后花了两周的时间,在DM642上实现快速去雾算法的视频处理,效果比较一般,以后再写一下具体的实验效果。

我们最终的目的的是实现水下激光成像,去雾算法和水下图像处理还是有一定的差距的。前段时间也没有看水下成像的仿真,只是看了一下具体的系统设计等等。今天看到能够用三个通道分别通过直方图规定化来进行增强,而我前段时间在学习那本经典的《数字图像处理》(冈萨雷斯)做过直方图均衡化的仿真,所以直接拿过程序进行仿真。通过实际测试效果还是可以的。下面列出一些具体的测试结果:

 

水下图像增强锐化 水下图像增强论文_水下图像增强锐化

水下图像增强锐化 水下图像增强论文_均衡化_02

水下图像增强锐化 水下图像增强论文_水下图像增强锐化_03

水下图像增强锐化 水下图像增强论文_均衡化_04

水下图像增强锐化 水下图像增强论文_水下图像增强锐化_05

 

 

MATLAB仿真程序:

%{

  基于直方图均衡化的水下图像增强(MATLAB仿真)

  对RGB三个通道分别进行均衡化处理,得到增强之后的图像

  实际测试,效果明显,下面

  时间:2014年9月11日23:59:01

  整理:天空之恋

  地点:桂电

%}
clear;
t = imread('wa5.png');  
I=t(:,:,1);
[height,width] = size(I);  
subplot(121);
imshow(t),title('原始图像')%显示原始图像   
%对R通道进行均衡化处理,均衡化可以写一个统一的函数,直接调用
%进行像素灰度统计;  
s = zeros(1,256);%统计各灰度数目,共256个灰度级  
%绘制直方图
gp=zeros(1,256);
for k=0:255
    gp(k+1)=length(find(I==k))/(height*width);
end
for i = 1:height  
    for j = 1: width  
        s(I(i,j) + 1) = s(I(i,j) + 1) + 1;%对应灰度值像素点数量增加一  
    end  
end  
%计算灰度分布密度  
p = zeros(1,256);  
for i = 1:256  
    p(i) = s(i) / (height * width * 1.0);  
end  
%计算累计直方图分布  
c = zeros(1,256);  
c(1) = p(1);
for i = 2:256   
        c(i) = c(i - 1) + p(i);  
end  
%累计分布取整,将其数值归一化为1~256 
c = uint8(255 .* c + 0.5);  
%对图像进行均衡化
for i = 1:height  
    for j = 1: width  
        Ir(i,j) = c(I(i,j)+1);  
    end  
end  
dis(:,:,1)=Ir;
%subplot(122)  
%imshow(Ir)%显示均衡化后的图像
%对G通道进行均衡化处理,均衡化可以写一个统一的函数,直接调用
I=t(:,:,2);
[height,width] = size(I);  
 
%下面使用直方图均衡化进行处理
%进行像素灰度统计;  
s = zeros(1,256);%统计各灰度数目,共256个灰度级  
%绘制直方图
gp=zeros(1,256);
for k=0:255
    gp(k+1)=length(find(I==k))/(height*width);
end
for i = 1:height  
    for j = 1: width  
        s(I(i,j) + 1) = s(I(i,j) + 1) + 1;%对应灰度值像素点数量增加一  
    end  
end  
%计算灰度分布密度  
p = zeros(1,256);  
for i = 1:256  
    p(i) = s(i) / (height * width * 1.0);  
end  
%计算累计直方图分布  
c = zeros(1,256);  
c(1) = p(1);
for i = 2:256   
        c(i) = c(i - 1) + p(i);  
end  
%累计分布取整,将其数值归一化为1~256 
c = uint8(255 .* c + 0.5);  
%对图像进行均衡化
for i = 1:height  
    for j = 1: width  
        Ig(i,j) = c(I(i,j)+1);  
    end  
end  
%subplot(122)  
%imshow(Ig)%显示均衡化后的图像
dis(:,:,2)=Ig;
 
%对B通道进行均衡化处理,均衡化可以写一个统一的函数,直接调用
I=t(:,:,3);
[height,width] = size(I);  
 
%下面使用直方图均衡化进行处理
%进行像素灰度统计;  
s = zeros(1,256);%统计各灰度数目,共256个灰度级  
%绘制直方图
gp=zeros(1,256);
for k=0:255
    gp(k+1)=length(find(I==k))/(height*width);
end
for i = 1:height  
    for j = 1: width  
        s(I(i,j) + 1) = s(I(i,j) + 1) + 1;%对应灰度值像素点数量增加一  
    end  
end  
%计算灰度分布密度  
p = zeros(1,256);  
for i = 1:256  
    p(i) = s(i) / (height * width * 1.0);  
end  
%计算累计直方图分布  
c = zeros(1,256);  
c(1) = p(1);
for i = 2:256   
        c(i) = c(i - 1) + p(i);  
end  
%累计分布取整,将其数值归一化为1~256 
c = uint8(255 .* c + 0.5);  
%对图像进行均衡化
for i = 1:height  
    for j = 1: width  
        Ib(i,j) = c(I(i,j)+1);  
    end  
end  
dis(:,:,3)=Ib; 
%subplot(122)  
%imshow(Ib)%显示均衡化后的图像 
subplot(122);
imshow(dis),title('处理之后的图像')%显示均衡化后的图像