基于文章【9】的方法
这是使用直接替换法所产生的融合图像,发现融合图像的亮度好像不太正常,这是因为不同的传感器具有不同的感光/等的传感特性差异。这些差异隐藏在图像当中,人眼看不出来这样的特性,但是当对它们进行处理之后,问题就会暴露出来。所以在这一章中,需要使用直方图匹配法和IHS变换的方法做一个衔接。先放出实验的结果吧:
直方图匹配
网上对直方图匹配的方法解释有许多,我本人对数学表示的方法非常喜欢,但是,感觉没看明白,懵懵的。
好在,像素是离散的。。。Δx,Δy都是等于1,这就很好算了有没有。。所以这里介绍的直方图匹配原理,我就不用数学语言描述了,改用图像+实例讲解。!
这张图就是直方图了,它代表是什么呢?横坐标是0~255,代表256级的灰度;纵坐标是该等级灰度的像素点占整体像素点的比例。
显然,将0~255的纵坐标值加起来,等于1。这个直方图其实就是概率的分布,也是图像的传感器特性。
这里我们用双峰函数为例,当做B图像进行演示。
它的曲线和我们的图像的曲线显然不同,直方图匹配的目的就是让图像A的概率分布变得和B一样,具备B的传感器特性。
经过直方图匹配后,A图像具有和B相似的概率分布了。这样的变化之后,再进行IHS变换,就会获得良好的融合效果了。
直方图匹配原理
那么如何让A,B两图像的概率分布相似呢?算法思想是很简单的:
1、计算A,B两个图片的概率。
2、计算累积概率(做到此步可以完成直方图均衡)。
3、在A的累积概率中寻找B的匹配项,也就是得到的匹配为B在A中的匹配。,得到B在A上的映射。
4、第3步的作用就是让累积概率进行相似化,调整累计概率,这种调整是单向的,不存在灰度值高的像素比灰度值低的像素更早被调整至某一灰度。
5、根据3进行灰度替换即可。
如果需要知道得非常清晰,还是建议去看看数学公式,可能才知道为什么要这样做。
MATLAB实现
1、计算概率,累积概率。
A=imread();
A=double(A);
[m,n]=size(A);
Pa=zeros(1,256); %计算概率分布
for i=1:m
for j=1:n
t=A(i,j);
Pa(1,t+1)=Pa(1,t+1)+1;
end
end
Pa=Pa./(m*n);
F1=cumsum(Pa); %计算累积概率
2、替换灰度
for i=1:256
temp{i}=F1-F2(1,i);
temp{i}=abs(temp{i}); %因为要找距离最近的点,所以取绝对值
[x,num(i)]=min(temp{i}); %找到两个累积直方图距离最近的点
end
out=zeros(m,n);
for i=1:m
for j=1:n
out(i,j)=num(B(i,j)+1)-1; %由原图的灰度通过索引映射到新的灰度
end
end
注
上述代码片无法直接运行,需要结合文章【9】以及自己修改才可以用。没有源代码,是因为我做完后不小心删掉了-,-,这代码写了有段时间不好复现了,所以上面那些都是直接打出来的代码。但是拿着用是没问题的,算法思想和步骤没错的。如果有运行了跑不了再告诉我吧。
总结
1、IHS处理色彩的问题很好用,比较新的论文也有围绕它们来做的,但是不在方法上创新,想着在应用上找不同。。有点下乘了。
2、只实现了最基本的功能,可以改进的地方有许多,举例来说:①、像是min函数这样的系统函数,自己重新编写一下最需要的功能可以改进提高匹配精度。②、IHS2RGB的变换公式可以改下,把1/3,1/3,1/3改成1/6,2/3,1/6也许视觉效果会更好。③、代码可以简化,for循环使用次数降低,提高计算速度。