当先锋百科网

首页 1 2 3 4 5 6 7

能量计算

       能量算法,顾名思义就是计算一幅图像或是一个像素区域的能量。能量对于图像而言就是灰度值,灰度值越高能量就越大对应的像素点就是“更白”。在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)。会用到本节的区域能量算法以及之前用过的一些算法,欢迎大家一起讨论、学习。