1.算法描述
脉冲耦合神经网络(PCNN-Pulse Coupled Neural Network)与传统神经网络相比,有着根本的不同。PCNN有生物学的背景,它是依据猫、猴等动物的大脑皮层上的同步脉冲发放现象提出的。PCNN有着广泛的应用,可应用于图像分割,边缘检测、细化、识别等方面。
PCNN是Eckhorn于20世纪90年代开始提出的一种基于猫的视觉原理构建的简化神经网络模型,与BP神经网络和Kohonen神经网络相比,PCNN不需要学习或者训练,能从复杂背景下提取有效信息,具有同步脉冲发放和全局耦合等特性,其信号形式和处理机制更符合人类视觉神经系统的生理学基础。
一个生理激励的人工神经网络,脉冲耦合神经网络(PCNN),可以连接起来创建一个高度灵活的生理滤波器。PCNN对灵长类视觉皮层中观察到的脉冲高度、持续时间、重复频率和神经间联系进行建模。该模型不仅能满足我们视觉模型的滤波要求,还能产生所需的连接和脉冲,以模拟依赖于状态的调制和时间同步。图4显示了PCNN中单个神经元的框图。
有关PCNN的更多讨论,请参见参考文献[3]和[5]。表2显示了实现离散时间PCNN所需的方程式。在该模型中,PCNN神经元接收来自前一层次结构层的馈电输入(X2),并接收来自其自身和其他层的链接输入(Y)。可重入输入将被视为链接输入。图5显示了样本PCNN中单个神经元的馈电和连接。
单个PCNN神经元的滤波特性由馈电输入的模式和应用于这些输入的权重决定。滤光片的感受野由前一层馈电输入连接的形状决定。滤波特性由应用于进给输入的权重确定。例如,一个具有高斯(椭圆形)感受野的神经元将具有以椭圆形模式连接到前一层的馈电输入。在该椭圆模式中,应用于进给输入的权重(M2)在中心处为单位,并随着朝向椭圆边缘的高斯曲线而减小。
PCNN的特征提取和对象分割特性来自神经元的脉冲频率。具有相关进食输入特征(颜色、强度等)的神经元具有相似的脉冲率。连接连接导致神经元紧密接近,相关特征一致脉冲(同步)。连接模式、权重(Wf)和连接系数(i:3)决定了连接输入影响神经元输出的接近度和程度。较大的链接字段往往会对图像产生平滑效果。较大的权重和连接系数(假设标准化,接近1)往往会导致相关特征较少的神经元同步。PCNN神经元(无连接)的脉冲重复率由馈电输入的大小决定。输入较大的神经元比输入较小的神经元脉冲频率更高。缺乏连接输入将导致具有相同馈电输入强度的神经元一致脉冲。对象分割高度依赖于链接系数8的值。
PCNN中的神经元数量等于输入图像中的像素数量。神经元被排列成一个具有横向连接的单层网络。每个神经元接收R半径内所有相邻神经元的链接输入。每个神经元只接收一个馈电输入,即输入图像中对应像素的强度。馈电输入上没有泄漏积分器。所有权重都设置为统一。
2.仿真效果预览
matlab2022a仿真结果如下:
3.MATLAB核心程序
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;
%统计循环次数
count=0;
Tempu1=zeros(a,b);
Tempu2=zeros(a+2,b+2);
%%%%%%图像增强部分%%%%%%
Out=zeros(a,b);
Out=uint8(Out);
for i=1:a
for j=1:b
if(i==1|j==1|i==a|j==b)
Out(i,j)=X(i,j);
else
H=[X(i-1,j-1) X(i-1,j) X(i-1,j+1);
X(i,j-1) X(i,j) X(i,j+1);
X(i+1,j-1) X(i+1,j) X(i+1,j+1)];
temp=d1*sum(sum(H.*WeightLI));
Out(i,j)=temp;
end
end
end
figure(2);
imshow(Out);
%%%%%%%%%%%%%%%%%%%
for count=1:30
for i0=2:a+1
for i1=2:b+1
V=[S(i0-1,i1-1) S(i0-1,i1) S(i0-1,i1+1);
S(i0,i1-1) S(i0,i1) S(i0,i1+1);
S(i0+1,i1-1) S(i0+1,i1) S(i0+1,i1+1)];
L=sum(sum(V.*Weight));
V2=[Tempu2(i0-1,i1-1) Tempu2(i0-1,i1) Tempu2(i0-1,i1+1);
Tempu2(i0,i1-1) Tempu2(i0,i1) Tempu2(i0,i1+1);
Tempu2(i0+1,i1-1) Tempu2(i0+1,i1) Tempu2(i0+1,i1+1)]; F=X(i0-1,i1-1)+sum(sum(V2.*WeightLI2));
%保证侧抑制图像无能量损失
F=d*F;
U=double(F)*(1+Beta*double(L));
Tempu1(i0-1,i1-1)=U;
if U>=Threshold(i0-1,i1-1)|Threshold(i0-1,i1-1)<60
T(i0-1,i1-1)=1;
Threshold(i0-1,i1-1)=Yuzhi;
%点火后一直置为1
Y(i0-1,i1-1)=1;
else
T(i0-1,i1-1)=0;
Y(i0-1,i1-1)=0;
end
end
end
Threshold=exp(-Decay)*Threshold+V_T*Y;
%被激活过的像素不再参与迭代过程
if n==1
S=zeros(a+2,b+2);
else
S=Bianhuan(T);
end
n=n+1;
count=count+1;
Firate=Firate+Y;
figure(3);
imshow(Y);
Tempu2=Bianhuan(Tempu1);
end
Firate(find(Firate<10))=0;
Firate(find(Firate>=10))=10;
figure(4);
imshow(Firate);