简单回顾一下以往的单通道PCNN模型,原理与实现步骤:
13、单通道PCNN原理
14、单通道PCNN融合代码实现
图1 单通道PCNN:
在单通道PCNN中,对于一个神经元的一次迭代过程正如图1描述:
①、F(i,j)代表外部刺激,在传统模型中这一刺激都是由I(i,j)提供,像素的灰度值直接作为神经元的刺激,在后来的研究中逐渐发现这样做不利于表达像素空间关系,从而使用各种算子代替I(i,j)成为外部刺激,在接收部分中除了外部刺激,还有“内部刺激”,这一刺激来自于上一次迭代的结果以及其他神经元上次迭代的结果,根据一定的权重共同组成“内部刺激”,注意,这一名词并不通用,仅用于理解。
②、调制部分是PCNN内部最重要思想体现,通过接收到的外部刺激与内部刺激,神经元产生了内部活动,内部活动在公式中被命名为U,它实质上是一个计算,将内部刺激视为权值,再结合β这个链接强度决定内部刺激这一权值在内部活动中的重要性,完后一个计算,将外部刺激转换为内部活动值F(i,j)→U(i,j)。
③、设定一个阈值,当内部活动的值大于这个阈值,就产生一个脉冲信号,这一部分就叫做脉冲产生部分,在离散的计算中,产生的脉冲信号就是1。阈值并不是一成不变的,通常选定一个初始阈值,如果内部活动U迟迟不能大于阈值,已经预先选择好的线性衰减系数或指数衰减系数令这个阈值衰减,阈值越来越小,终于U可以大于阈值T了,当产生脉冲信号后,阈值T立刻增大到这个值(初始阈值T加上上次U大于T时的T值),显然此时T>=初始T。
综上所述,我们还是喜欢数学表达式:
二、双通道PCNN
双通道PCNN其原理与单通道其实类似,我们在使用单通道PCNN进行图像融合时,需要对两幅图像分别进行PCNN的点火,得到点火图之后通常根据极大值原则便确立融合决策图。此时我们的PCNN模型需要独立运行两次–PCNN本身就是迭代计算的,所以运行2次会产生较大的计算开销,这是第一点。第二点就是两个PCNN各自点各自的火,耦合性质只体现在每幅图像内部像素点之间,而图像之间并不存在耦合性。
说了这么多就是为了引出本文的双通道PCNN,它主要是针对上述两点问题而提出的一种“新型”PCNN模型,且提出很久了,分析它的结构,我们还可以做出三通道、四通道PCNN。
图2 双通道PCNN:与单通道一样,双通道同样有3个部分来描述单个神经元的单次运行,如图2。
①、我们在一种定义了外部刺激与内部刺激。在接收部分中,双通道与单通道在内部刺激的接收中是没有区别的,区别在于外部刺激同时接收双线信号:I1与I2,分别表示2个不同的外部刺激,在后面的调制部分中,也将变成两条并行的线路同时计算,增加I的数量,可以类似定义三通道、四通道PCNN。
②、在①中,我们将外部刺激I1与内部刺激结合,可以形成路线1;将外部刺激I2与内部刺激结合,可以形成路线2。这两路同时做U内部活动的计算,但是内部活动U向第三部分脉冲部分进行的时候,只输出一个值,两路产生2个内部活动值,此时,取最大值流入第三部分是它与单通道最大的不同。
③、在经过步骤①②之后,第三部分的工作原理与单通道也是完全一致的。
④、需要注意的是,大体框架虽然没有区别,但是根据用法的不同,实际上的PCNN模型可以做许多微调,比如内部刺激,我们通常采用窗口内神经元的上次迭代值来辅助决策内部刺激,但是有许多成功的dual-PCNN并不采用窗口,而是简单地定义为0或1,。这是出于这样的考虑:
观察这两行公式,L是一个只与前次L和前次Y相关的一个变量,它并不受外部刺激的影响,而在U中,L作为一个数字,还要和β相乘。β的值要么是固定值,要么是自适应,分开讨论:当β是定值,β相当于常数可以直接乘在第一行的L公式里面,L不具备自适应特性,对于单次计算来说,L也是一个固定值,此时β对机制的调节作用要明显于L,此时应当维持原公式不变化;当β是自适应的时候,βL反而会变成一个不确定的值,既然L对机制的调节作用不如β重要,确定了一个β,但是βL整体是不可控的,这对机制的把握其实是不利的,在β不能自适应的时候,我们要依赖L,但是现在β自适应了,L的不确定反而会影响β,因此在很多案例中,把βL作为一个整体去优化,而不单单优化β,因为只优化β依然无法完全控制机制。
基于上面的分析,在双通道PCNN中,既然强调的是2个外部刺激之间的耦合性,那也可以舍弃一定的神经元之间的耦合性,这相当于强化d-PCNN的特性,最终,L被简化为了一个0/1的常数。
这只是一个举例,我们分别给出一个常规双通道PCNN的数学定义,和一个流行的双通道PCNN的数学定义:
常规PCNN
clc;clear;close all;
A=imread('05A.jpg');A=double(A);
B=imread('05B.jpg');B=double(B);
C=dual_PCNN(A,B);
figure;imshow(A,[]);
figure;imshow(B,[]);
figure;imshow(C,[]);
function R=dual_PCNN(matrixA,matrixB)
L1=[-1,-1,-1;-1,8,-1;-1,-1,-1];
AA=conv2(matrixA,L1,'same');BB=conv2(matrixB,L1,'same');
[p,q]=size(matrixA);
F_NA=Normalized(matrixA);F_NB=Normalized(matrixB);
L=zeros(p,q);U=zeros(p,q);Y=zeros(p,q);Y0=zeros(p,q);Theta=zeros(p,q);betaA=AA;betaB=BB;con=ones(p,q);fuse=zeros(p,q);
np=200;
alpha_Theta=0.2;
vTheta=20;
for n=1:np
if sum(sum(Y))<=0
L=zeros(p,q);
else
L=ones(p,q);
end
Theta=exp(-alpha_Theta)*Theta+vTheta*Y;
U=max(F_NA.*(con+betaA.*L),F_NB.*(con+betaB.*L));
Y=im2double(U>Theta);
Y0=Y0+Y;
end
for i = 1:p
for j = 1:q
if(F_NA(i,j)*(1+betaA(i,j)*L(i,j)) == U(i,j ))
fuse(i,j) = matrixA(i,j);
else
if(F_NB(i,j)*(1+betaB(i,j)*L(i,j)) == U(i,j))
fuse(i,j) = matrixB(i,j);
end
end
end
end
R=fuse;
end
function normalized_matrix=Normalized(matrix)
input_matrix=abs(matrix);
Max_input=max(input_matrix(:));
Min_input=min(input_matrix(:));
min_matrix=ones(size(input_matrix)).*Min_input;
normalized_matrix=(input_matrix-min_matrix)./(Max_input-Min_input+eps);
end
可以看到,效果还不错,下面补一个单通道的测试结果:
clc;clear;close all;
im=imread('05A.jpg');
im=double(im);
im2=imread('05B.jpg');
im2=double(im2);
link_arrange=3;
iteration_times=300;
firing_times1=PCNN_large_arrange(im,link_arrange,iteration_times);
firing_times2=PCNN_large_arrange(im2,link_arrange,iteration_times);
[m,n]=size(im2);
for i=1:m
for j=1:n
if firing_times1>=firing_times2
fuse(i,j)=im(i,j);
else
fuse(i,j)=im2(i,j);
end
end
end
figure;imshow(im,[]);
figure;imshow(im2,[]);
figure;imshow(fuse,[]);
function R=PCNN_large_arrange(matrix,link_arrange,np)
F_NA=Normalized(matrix);
disp('PCNN is processing...')
[p,q]=size(matrix);
alpha_L=1;
alpha_Theta=0.2;
beta=3;
vL=1.00;
vTheta=10;
% Generate the null matrix that could be used
L=zeros(p,q);
U=zeros(p,q);
Y=zeros(p,q);
Y0=zeros(p,q);
Theta=zeros(p,q);
% Compute the linking strength.
center_x=round(link_arrange/2);
center_y=round(link_arrange/2);
W=zeros(link_arrange,link_arrange);
for i=1:link_arrange
for j=1:link_arrange
if (i==center_x)&&(j==center_y)
W(i,j)=0;
else
W(i,j)=1./sqrt((i-center_x).^2+(j-center_y).^2);
end
end
end
F=F_NA;
for n=1:np
K=conv2(Y,W,'same');
L=exp(-alpha_L)*L+vL*K;
Theta=exp(-alpha_Theta)*Theta+vTheta*Y;
U=F.*(1+beta*L);
Y=im2double(U>Theta);
Y0=Y0+Y;
end
R=Y0;
end
function [normalized_matrix,cmin,cmax]=Normalized(matrix)
input_matrix=abs(matrix);
Max_input=max(input_matrix(:));
Min_input=min(input_matrix(:));
min_matrix=ones(size(input_matrix)).*Min_input;
normalized_matrix=(input_matrix-min_matrix)./(Max_input-Min_input+eps);
cmin=Min_input;
cmax=Max_input;
end