基于PCNN脉冲耦合神经网络的图像分割

979 阅读4分钟

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)在中心处为单位,并随着朝向椭圆边缘的高斯曲线而减小。

 

1.png

 

       PCNN的特征提取和对象分割特性来自神经元的脉冲频率。具有相关进食输入特征(颜色、强度等)的神经元具有相似的脉冲率。连接连接导致神经元紧密接近,相关特征一致脉冲(同步)。连接模式、权重(Wf)和连接系数(i:3)决定了连接输入影响神经元输出的接近度和程度。较大的链接字段往往会对图像产生平滑效果。较大的权重和连接系数(假设标准化,接近1)往往会导致相关特征较少的神经元同步。PCNN神经元(无连接)的脉冲重复率由馈电输入的大小决定。输入较大的神经元比输入较小的神经元脉冲频率更高。缺乏连接输入将导致具有相同馈电输入强度的神经元一致脉冲。对象分割高度依赖于链接系数8的值。

        PCNN中的神经元数量等于输入图像中的像素数量。神经元被排列成一个具有横向连接的单层网络。每个神经元接收R半径内所有相邻神经元的链接输入。每个神经元只接收一个馈电输入,即输入图像中对应像素的强度。馈电输入上没有泄漏积分器。所有权重都设置为统一。

 

2.仿真效果预览

matlab2022a仿真结果如下:

 

2.png

 

3.MATLAB核心程序 `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;

%统计循环次数

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+Betadouble(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_TY;

   %被激活过的像素不再参与迭代过程

     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);`