开发者社区> 技术小胖子> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

基于PCNN的图像分割的matlab实现

简介:
+关注继续查看

图像分割是一种重要的图像技术,在理论研究和实际应用中都得到了人们的广泛重视。图像分割的方法和种类有很多,有些分割运算可直接应用于任何图像,而另一些只能适用于特殊类别的图像。有些算法需要先对图像进行粗分割,因为他们需要从图像中提取出来的信息。例如,可以对图像的灰度级设置门限的方法分割。许多不同种类的图像或景物都可作为待分割的图像数据,不同类型的图像,已经有相对应的分割方法对其分割,同时,某些分割方法也只是适合于某些特殊类型的图像分割。分割结果的好坏需要根据具体的场合及要求衡量。图像分割是从图像处理到图像分析的关键步骤,可以说,图像分割结果的好坏直接影响对图像的理解。

脉冲耦合神经网络( PCNN) 是一种不同于传统人工神经网络的新型神经网络,它有着重要的生物学背景,是由Eckhorn 为解释在猫的大脑视觉皮层中实验所观察到的与特征有关的神经元同步行为现象而提出的。PCNN 的这个生物学背景使它在图像处理中具有先天优势,有着与传统方法进行图像处理所无法比拟的优越性。下面的程序是基于PCNN最基本的图像分割的matlab实现,分割效果较好。

主程序:

 


  1. function[Edge,Numberofaera]=PCNN(X)  
  2. %X:输入的灰度图像,Edge:检测到的一些边界点,Numberofaera则表明了在各次迭代时激活的块区域  
  3. clear;  
  4. clc;  
  5. I=imread('lena1.bmp');  
  6. [Xa,Ya]=size(I);  
  7. subplot(1,2,1);  
  8. imshow(I);  
  9. %imshow(I);  
  10. X=double(I);  
  11. %X=double(imread('lena.bmp'));  
  12. Weight=[0.5 1 0.5;1 0 1;0.5 1 0.5];   %此可权值矩阵的选取原则(或者根据)是什么?  
  13. Beta=0.32;  
  14. Yuzhi=200;  
  15. Decay=0.31;  
  16. [a,b]=size(X);  
  17. Threshold=zeros(a,b);  
  18. S=zeros(a+2,b+2);  
  19. B=zeros(a,b);   %标记样板,表明该pixel是否被激活过;  
  20. Y=zeros(a,b);  
  21. Edge=zeros(a,b);Numberofaera=zeros(a,b);Numberofaera_1=zeros(a,b);  
  22. Num_1=0;Num=0;  
  23. n=1;  
  24. while(sum(sum(B))~=Xa*Ya)   %若采用128*128的图像,须注意。  
  25.     for i0=2:a+1  
  26.         for i1=2:b+1  
  27.             V=[S(i0-1,i1-1) S(i0-1,i1) S(i0-1,i1+1);  
  28.                 S(i0,i1-1) S(i0,i1) S(i0,i1+1);  
  29.                 S(i0+1,i1-1) S(i0+1,i1) S(i0+1,i1+1)];   
  30.             L=sum(sum(V.*Weight));  
  31.             F=X(i0-1,i1-1);  
  32.             U=double(F)*(1+Beta*double(L));  
  33.             if U>=Threshold(i0-1,i1-1)|Threshold(i0-1,i1-1)<95  
  34.                 T(i0-1,i1-1)=1;   %这是什么?  
  35.                 Threshold(i0-1,i1-1)=Yuzhi;  
  36.                 Y(i0-1,i1-1)=1;  
  37.                 if n==1  
  38.                     B(i0-1,i1-1)=0;   %避免第一次全部激发造成的影响  
  39.                 else 
  40.                     B(i0-1,i1-1)=1;  %已发射过的标记  
  41.                     Threshold(i0-1,i1-1)=1000000;%相当于不会被第二次激活  
  42.                 end   
  43.             else 
  44.                 T(i0-1,i1-1)=0;  %no use?  
  45.                 Y(i0-1,i1-1)=0;  
  46.             end 
  47.         end 
  48.     end 
  49. Threshold(find(B~=1))=exp(-Decay)*Threshold(find(B~=1));  
  50. %被激活过的像不再参与迭代过程  
  51. if n~=1  
  52.     Edge=Edge+judge_edge(Y,n);  
  53.     Y(find(Edge<0))=0;   %边界点被置零,Y本来是激发的像素,现在边界被置零,  
  54.                          %也不能说白激发了,B矩阵有纪录!当然下次就休想再被激发  
  55.     [Numberofaera_1,Num_1]=bwlabel(Y,4);  
  56.     for i=1:a  
  57.         for j=1:b  
  58.             if Numberofaera_1(i,j)~=0  
  59.                  Numberofaera_1(i,j)=Numberofaera_1(i,j)+Num;        
  60.             end 
  61.         end 
  62.     end 
  63.     Numberofaera=Numberofaera+Numberofaera_1;  
  64.     Num=Num_1;  
  65. end 
  66. if n==1  
  67.     S=zeros(a+2,b+2);  
  68. else 
  69.     S=Bianhuan(T);  
  70. end 
  71. n=n+1;  
  72. Numberofaera_1=zeros(a,b);  
  73. subplot(1,2,2);  
  74. imshow(S);  
  75. end  %while  
  76.                  
  77.                 

边缘检测:

 


  1. function Y=judge_edge(X,n)   %X:每次迭代后PCNN输出的二值图像,如何准确判断边界点是关键  
  2. [a,b]=size(X);  
  3. T=Jiabian(X);  
  4. Y=zeros(a,b);  
  5. W=zeros(a,b);  
  6. for i=2:a+1  
  7.     for j=2:b+1  
  8.         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))  
  9.             Y(i-1,j-1)=-n;  
  10.         end 
  11.     end 
  12. end 

 

这一步也非常重要——加边,所谓加班就是在二维方向上对图像进行扩充,把扩充后的图像最边缘作为图像的边缘,以下程序实现图像的扩充


  1. function Y=Jiabian(X)  
  2. [m,n]=size(X);  
  3. Y=zeros(m+2,n+2);  
  4. for i=1:m+2  
  5.     for j=1:n+2  
  6.         if i==1&j~=1&j~=n+2  
  7.             Y(i,j)=X(1,j-1);  
  8.         elseif j==1&i~=1&i~=m+2  
  9.                 Y(i,j)=X(i-1,1);  
  10.         elseif i~=1&j==n+2&i~=m+2  
  11.                 Y(i,j)=X(i-1,n);  
  12.         elseif i==m+2&j~=1&j~=n+2  
  13.             Y(i,j)=X(m,j-1);  
  14.         elseif i==1&j==1  
  15.             Y(i,j)=X(i,j);  
  16.         elseif i==1&&j==n+2  
  17.             Y(i,j)=X(1,n);  
  18.         elseif i==(m+2)&j==1  
  19.             Y(i,j)=X(m,1);  
  20.         elseif i==m+2&j==n+2  
  21.             Y(i,j)=X(m,n);  
  22.         else  
  23.             Y(i,j)=X(i-1,j-1);  
  24.         end  
  25.      end  
  26. end            
  27.                      
  28.                  

 

变换:


  1. function Y=Bianhuan(X)  
  2. [m,n]=size(X);  
  3. Y=zeros(m+2,n+2);  
  4. for i=1:m+2  
  5.     for j=1:n+2  
  6.         if i==1|j==1|i==m+2|j==n+2  
  7.             Y(i,j)=0;  
  8.         else          
  9.             Y(i,j)=X(i-1,j-1);  
  10.         end 
  11.     end 
  12. end 

 

变换和扩充几乎在每一个图像处理程序中都会用到,扩充也叫加边,另外还有去边的步骤。

处理效果:

 

 

本程序为最基本的PCNN图像分割,可从以下两个方面进行拓展

1.众所周知,PCNN的参数比较多,而且一般根据实验后的经验决定,参数确实非常难,可以通过一些智能算法对其参数进行训练

2.这是最基本的PCNN,使用改进的PCNN效果会更好






     本文转自 gaochaojs 51CTO博客,原文链接:http://blog.51cto.com/jncumter/293455,如需转载请自行联系原作者



版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
数字图像处理实验(六)|图像分割{阈值分割、直方图法、OTUS最大类间方差法(edge、im2dw、imfilter、imresize)、迭代阈值法、点检测}(附matlab实验代码和截图)
数字图像处理实验(六)|图像分割{阈值分割、直方图法、OTUS最大类间方差法(edge、im2dw、imfilter、imresize)、迭代阈值法、点检测}(附matlab实验代码和截图)
0 0
【图像分割】基于收缩系数的粒子群混合引力搜索算法多级图像阈值分割算法研究附matlab代码
【图像分割】基于收缩系数的粒子群混合引力搜索算法多级图像阈值分割算法研究附matlab代码
0 0
【图像分割】基于Kmean聚类 分水岭、oust、粒子群算法优化脂肪肝图像分割附matlab代码
【图像分割】基于Kmean聚类 分水岭、oust、粒子群算法优化脂肪肝图像分割附matlab代码
0 0
【图像分割】基于PCA结合模糊聚类算法FCM实现SAR图像分割附matlab代码
【图像分割】基于PCA结合模糊聚类算法FCM实现SAR图像分割附matlab代码
0 0
【图像分割】基于神经气体网络 (NGN)实现图像分割附matlab代码
【图像分割】基于神经气体网络 (NGN)实现图像分割附matlab代码
0 0
基于萤火虫算法的图像分割的应用附Matlab代码
基于萤火虫算法的图像分割的应用附Matlab代码
0 0
【图像分割】基于均值聚类+OUST+区域生长法实现MRI图像分割附matlab代码
【图像分割】基于均值聚类+OUST+区域生长法实现MRI图像分割附matlab代码
0 0
基于麻雀算法二维oust图像分割算法研究附matlab代码
基于麻雀算法二维oust图像分割算法研究附matlab代码
0 0
【图像分割】基于改进的主动轮廓模型实现图像分割附matlab代码
【图像分割】基于改进的主动轮廓模型实现图像分割附matlab代码
0 0
【图像分割】基于电磁算法优化多级阈值实现图像分割附matlab代码
【图像分割】基于电磁算法优化多级阈值实现图像分割附matlab代码
0 0
文章
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载