能量计算
能量算法,顾名思义就是计算一幅图像或是一个像素区域的能量。能量对于图像而言就是灰度值,灰度值越高能量就越大对应的像素点就是“更白”。在8位的灰度图中,0代表黑色,255代表白色。
通俗地讲,能量计算就是计算图像的灰度值。最常用的方法,如果计算一整个图像的能量,那么就将每一个像素点的灰度值拿出来平方,然后把它们加起来。如果计算一个区域的能量,就是将区域内的像素点灰度值平方累加。
区域能量算法
与能量计算的概念相同,区域能量算法也需要用到像素的灰度值;但是这里的“区域”在一些情况下,我们将其转变说法:单个像素点及其邻域范围。这时候上面的说法就被称为“区域”。
为什么要强调单个像素点,是因为要用到权重。这里可以构建一个1/16【1,2,1;2,4,2;1,2,1】的矩阵当做权值,取图像3*3的区域去乘以权重,然后加起来作为中心点像素的区域能量。这样遍历整个图像之后,就可以得到和原图像同大小的区域能量矩阵了。
用数学的方式来描述:
①、这里的p,q定义了区域的大小。
②、w是权重。
③、LAn表示金字塔的第n层。
④、(i,j)是邻域的中心点,也是能量矩阵中的第(i,j)点。
MATLAB实现
function new=fenergy(a,b)
a=double(a);
b=double(b);
[m,n]=size(a);
temp_a=nlfilter(a,[3 3],@nengliang); %邻域滑动操作 %help nlfilter
temp_b=nlfilter(b,[3 3],@nengliang); %对每个[3,3]大小的区域滑动并且执行nengliang函数。
for i=1:m %根据能量大小进行融合
for j=1:n
if temp_a(i,j)>=temp_b(i,j)
new(i,j)=a(i,j);
else
new(i,j)=b(i,j);
end
end
end
new=(new);
end
function c=nengliang(x) %权值函数
A=[1,2,1]; %习惯用大写字母表示矩阵,小写字母表示数字。
C=A*A'.*x.*(1/16);
c=sum(sum(C));
函数调用
clear;clc;
a=imread('1.tif');
b=imread('2.tif');
y=fenergy(a,b);
subplot 221;imshow(uint8(a));title('左模糊')
subplot 222;imshow(uint8(b));title('右模糊')
subplot 223;imshow(uint8(y));title('区域能量取大')
运行结果:
在做了许多的准备工作后,下一节终于来到了拉普拉斯金字塔融合(LPT)。会用到本节的区域能量算法以及之前用过的一些算法,欢迎大家一起讨论、学习。