⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pcnn.m

📁 我自己编写的基于自动细胞机的图像分割算法的源程序
💻 M
字号:
function [Edge,Numberofaera]=pcnn(X)
%X:输入的灰度图像,Edge:检测到的一些边界点,Numberofaera则表明了在各次迭代时激活的块区域
X=double(imread('lena128.jpg'));
%X=double(X)
Weight=[0.5 1 0.5;1 0 1;0.5 1 0.5];% quan
Beta=0.4   %
Yuzhi=240
Decay=0.3   %衰减
[a,b]=size(X)
Threshold=zeros(a,b);  %门限值
S=zeros(a+2,b+2);
B=zeros(a,b);%标记样板,表示该Pixel是否被激活
Y=zeros(a,b);
Edge=zeros(a,b);
Numberofaera=zeros(a,b);
Numberofaera_1=zeros(a,b);
Num_1=0;
Num=0;
n=1

while(sum(sum(B))~=128*128) %若采用128×128图像
    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));
              F=X(i0-1,i1-1);
              U=double(F)*(1+Beta*double(L));  %double可以不加
                 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;
                    Y(i0-1,i1-1)=1;
                     if n==1
                        B(i0-1,i1-1)=0;%避免第一次全部激发造成的影响
                        else
                        B(i0-1,i1-1)=1;%已发射过的标记
                        Threshold(i0-1,i1-1)=1000000;%相当于不会第二次激活
                     end
                     else
                       T(i0-1,i1-1)=0;%no use?
                       Y(i0-1,i1-1)=0;
             
                 end
            end
         end
        Threshold(find(B~=1))=exp(-Decay)*Threshold(find(B~=1));
        %被激活过的象素不再参与迭代过程
        if n~=1
           Edge=Edge+judge_edge(Y,n);
           Y(find(Edge<0))=0;%边界点被置零,Y本来是激发的象素,现在边界被置0,也不能说白激发了,B矩阵有记录!当然下次就休想再被激发了
           [Numberofaera_1,Num_1]=bwlabel(Y,4);
          for i=1:a
              for j=1:b
                 if Numberofaera_1(i,j)~=0 
                    Numberofaera_1(i,j)=Numberofaera_1(i,j)+Num;
                    end
               end
               end
       Numberofaera=Numberofaera+Numberofaera_1;
       Num=Num_1;
     end
     if n==1
        S=zeros(a+2,b+2);
        else
        S=Bianhuan(T);
     end
     n=n+1;
     Numberofaera_1=zeros(a,b);
     end
     

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -