PCNN在图像融合中应用广泛
1、脉冲耦合的神经元之间有有耦合和无耦合两种形式。,有耦合的神经元之间存在能量传播,产生同步脉冲发放,从而将输入相似的神经元在同一时刻点火。
3、脉冲神经网络–第三代人工神经网络。
4、PCNN是由多个PCNN神经元构成的单层反馈型网络,因此适合实时的图像处理环境,每个神经元由三个部分组成:接受部分、调制部分、脉冲产生部分。
5、PCNN神经元的个数和像素的个数相同,它们是一一对应的。且神经元的外部刺激等于图像的灰度值或者归一化之后的灰度值。当β=0时,这时候是没有耦合的。
6、PCNN如何工作:
一、不存在耦合:
1、假设神经元的反馈输入只有外部刺激一项,Sij>0;n=0时,时间t=0;Uij(0)=Sij-Tij >0,那么神经元(i.j)输出为高电平。这里的Tij是动态门限。
2、当高电平被输出时,Tij迅速增加到设定的常数VT,VT>Sij,从而使得Sij-Tij<0,输出低电平。
3、经过步骤1、2,神经元(i,j)输出了一个脉冲,这称为点火一次。在门限值Tij从VT衰减到Sij期间,神经元(i,j)是一直保持低电平的,而后当Uij>0时,重新点火,如此往复下去。
于是,神经元(i,j)的运行是这样的,在外部刺激Sij的作用下,以频率发送脉冲,频率为:
。所以,灰度值越大,点火频率就越高。,不同灰度值输入的神经元也会在不同的时刻被点火,而输入相同的神经元将在同一时间被点火。
4、经过1,2,3步之后,PCNN就把图像变成了一个和时间相关的点火图了。
二、存在耦合:
当β/=0时,神经元是否点火要受周围神经元的影响。
1、假设这里有一个强刺激神经元(i,j),在第n次迭代点火的时候,它的邻近神经元(p,n),其刺激spq由spq变为(1+βLpq)spq,【Lpq是神经元内部参数之一,连接输入】也就是神经元(p,q)的刺激被提高了。
2、如果此时,更新的spq大于阈值T,这会导致神经元(p,q)在第n次迭代的时候被提前点火。这个过程称为神经元(p.q)被神经元(i,j)捕获。
3、如此,当链接强度β和链接输入L越大,和神经元(i,j)同步点火的神经元就越多。那么,像素值越接近,就越容易被捕获。
4、于是,在存在耦合的情况下,耦合的神经元很有可能会出现集体的点火行为,发放同步脉冲:总结为空间近邻、强度相似的神经元倾向于在同一时刻点火。
5、这时PCNN的点火图就是有特征地将图像变成时间轴的点火图。
PCNN的特性:1、构成PCNN系统的每一个神经元是动态的
2、PCNN不需要训练,是强自适应系统。
最后回顾一下PCNN的神经元结构:
M,W为权值;F,L,T分别是反馈,链接,阈值的意义;V是放大系数,a是常数,U是内部行为,Y是输出,S是外部刺激(像素值)。
function [Edge,Numberofaera]=pcnn(X)
% 功能:采用PCNN算法进行边缘检测
% 输入:X—输入的灰度图像
% 输出:Edge—检测到的 Numberofaera—表明了在各次迭代时激活的块区域
X=imread('lena.JPG');
figure(1);
imshow(X);
X=double(X);
% 设定权值
Weight=[0.07 0.1 0.07;0.1 0 0.1;0.07 0.1 0.07];
WeightLI2=[-0.03 -0.03 -0.03;-0.03 0 -0.03;-0.03 -0.03 -0.03];
d=1/(1+sum(sum(WeightLI2)));
%%%%%%测试权值%%%%%%
WeightLI=[-0.03 -0.03 -0.03;-0.03 0.5 -0.03;-0.03 -0.03 -0.03];
d1=1/(sum(sum(WeightLI)));
%%%%%%%%%%%%%%%%%%
Beta=0.4;
Yuzhi=245;
%衰减系数
Decay=0.3;
[a,b]=size(X);
V_T=0.2;
%门限值
Threshold=zeros(a,b);
S=zeros(a+2,b+2);
Y=zeros(a,b);
%点火频率
Firate=zeros(a,b);
n=1;
imshow(Firate);
%%%%%%子函数 %%%%%%%
function Y=Jiabian(X)
[m,n]=size(X);
Y=zeros(m+2,n+2);
for i=1:m+2
for j=1:n+2
if i==1&j~=1&j~=n+2
Y(i,j)=X(1,j-1);
elseif j==1&i~=1&i~=m+2
Y(i,j)=X(i-1,1);
elseif i~=1&j==n+2&i~=m+2
Y(i,j)=X(i-1,n);
elseif i==m+2&j~=1&j~=n+2
Y(i,j)=X(m,j-1);
elseif i==1&j==1
Y(i,j)=X(i,j);
elseif i==1&j==n+2
Y(i,j)=X(1,n);
elseif i==(m+2)&j==1
Y(i,j)=X(m,1);
elseif i==m+2&j==n+2
Y(i,j)=X(m,n);
else
Y(i,j)=X(i-1,j-1);
end
end
end
%%%%%%子函数%%%%%%
function Y=Bianhuan(X)
[m,n]=size(X);
Y=zeros(m+2,n+2);
for i=1:m+2
for j=1:n+2
if i==1|j==1|i==m+2|j==n+2
Y(i,j)=0;
else
Y(i,j)=X(i-1,j-1);
end
end
end
%%%%%%子函数%%%%%%
function Y=judge_edge(X,n)
%X:每次迭代后PCNN输出的二值图像,如何准确判断边界点是关键
[a,b]=size(X);
T=Jiabian(X);
Y=zeros(a,b);
W=zeros(a,b);
for i=2:a+1
for j=2:b+1
if (T(i,j)==1)&((T(i-1,j)==0&T(i+1,j)==0)|(T(i,j-1)==0&T(i,j+1)==0)|(T(i-1,j-1)==0&T(i+1,j+1)==0)|(T(i+1,j-1)==0&T(i-1,j+1)==0))
Y(i-1,j-1)=-n;
end
end
end