1,全局直方图处理
Matlab通过函数imread读取RGB图像,并通过维数m*n*3的矩阵来表示。其中,维数mn表示图像的行数列数信息,维数3表示图像的RGB三层通道数据。因此,全局直方图处理通过对RGB图像的RGB三通道分别进行直方图均衡化,再整合到新的图像的方式进行。
>> [Xs,MAPs]=imread('D:\Pic\fog9','jpg'); >> imshow(Xs) >> R=Xs(:,:,1); >> G=Xs(:,:,2); >> B=Xs(:,:,3); >> M=histeq(R); >> N=histeq(G); >> L=histeq(B); >> In=cat(3,M,N,L); >> imshow(In)
效果如下
直方图效果:
>> Q=rgb2gray(Xs); >> W=rgb2gray(In); >> subplot(1,2,1);imhist(Q,64); >> subplot(1,2,1);imshow(Xs); >> subplot(1,2,1);imhist(Q,64); >> subplot(1,2,2);imhist(W,64)
2,局部直方图处理
可以看到,全局直方图均衡化增强只是将原图像的直方图进行了均衡化,未能有效保持原始图像的局部特征,容易出现色彩失真问题。通过局部直方图处理可以在一定层度上保持原有图像的局部特征,提高去雾的效果。所谓的局部直方图处理就是选择固定尺寸的滑动窗口作用于原始图像来进行局部的处理,通过对RGB三通道进行局部直方图均衡化,然后再整合到新的图像中。
>> [Img,MAPs]=imread('D:\Pic\fog9','jpg'); >> imshow(Img) >> g1=GetLocalHisteq(Img(:,:,1)); >> g2=GetLocalHisteq(Img(:,:,2)); >> g3=GetLocalHisteq(Img(:,:,3)); >> ImgS=cat(3,g1,g2,g3); >> subplot(1,2,1);imshow(Img);subplot(1,2,2);imshow(ImgS);
其中我们需要自行编写函数GetLocalHisteq()的代码,其代码如下
function g = GetLocalHisteq(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)); end
效果图: