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

目录

1.算法描述

2.仿真效果预览

3.MATLAB核心程序

4.完整MATLAB


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脉冲耦合神经网络的图像分割_第1张图片

       PCNN的特征提取和对象分割特性来自神经元的脉冲频率。具有相关进食输入特征(颜色、强度等)的神经元具有相似的脉冲率。连接连接导致神经元紧密接近,相关特征一致脉冲(同步)。连接模式、权重(Wf)和连接系数(i:3)决定了连接输入影响神经元输出的接近度和程度。较大的链接字段往往会对图像产生平滑效果。较大的权重和连接系数(假设标准化,接近1)往往会导致相关特征较少的神经元同步。PCNN神经元(无连接)的脉冲重复率由馈电输入的大小决定。输入较大的神经元比输入较小的神经元脉冲频率更高。缺乏连接输入将导致具有相同馈电输入强度的神经元一致脉冲。对象分割高度依赖于链接系数8的值。
        PCNN中的神经元数量等于输入图像中的像素数量。神经元被排列成一个具有横向连接的单层网络。每个神经元接收R半径内所有相邻神经元的链接输入。每个神经元只接收一个馈电输入,即输入图像中对应像素的强度。馈电输入上没有泄漏积分器。所有权重都设置为统一。

2.仿真效果预览

matlab2022a仿真结果如下:

基于PCNN脉冲耦合神经网络的图像分割_第2张图片

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+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);
 A129

4.完整MATLAB

V

你可能感兴趣的:(Matlab深度学习,神经网络,深度学习,PCNN,脉冲耦合神经网络,图像分割)