• Snake 算法
分享一下我老师大神的人工智能教程！零基础，通俗易懂！http://blog.csdn.net/jiangjunshow也欢迎大家转载本篇文章。分享知识，造福人民，实现我们中华民族伟大复兴！                Snake 算法或Active Contour Models。这类算法需要给出初始的轮廓，然后进行迭代，使轮廓沿能量降低的方向靠近，最后得到一个优化的边界。能量函数包括内外力两方面，如边界曲率和梯度。由于用户无法估计迭代的最后结果，应用Snake 算法往往需要进行多次的交互工作。特别当目标比较复杂时，或与其它物体靠得较近时，初始的轮廓不易确定，而迭代的结果往往不能达到要求。/CODE:/bool termination_point bool neighbor3by3; /* true means 3x3 neighborhood, false means 5x5 neighborhood */ int grad_mag[500][500]; /* Magnitude of Gradient */ int m_Cols; /* Number of Columns */ int m_Rows; /* Number of Rows */ int no_of_snake_points; CPoint Snake_points[200]; /* Snake Points */ double *alpha,*beta, *gamma; /* Weights for energies */ double threshold_curvature;  int threshold_movement;void Snake_algorithm() { bool flag_change; int movement,i,j,iteration=0; double avg_distance=0.0, max_curvature; CPoint temp; double *curvature;  alpha=new double[no_of_snake_points]; beta=new double[no_of_snake_points]; gamma=new double[no_of_snake_points]; curvature=new double[no_of_snake_points]; termination_point=false; for(i=0;i<no_of_snake_points;i++) {  *(alpha+i)=1.0;  *(beta+i)=1.0;  *(gamma+i)=1.2;  avg_distance+=find_distance(i, Snake_points[i]); } j=no_of_snake_points; pdc=GetDC(); while(!termination_point) {  movement=0;  avg_distance=avg_distance/(double)no_of_snake_points;  max_curvature=-1000000000.0;  for(i=0;i<no_of_snake_points;i++)  {   temp=find_min_energy(i, Snake_points[i],avg_distance);   flag_change=false;   if(temp!=Snake_points[i]&&temp!=Snake_points[(i-1+j)%j]&&temp!=Snake_points[(i+1)%j])   {    Snake_points[i]=temp;    movement++;   }   curvature[i]=find_curvature(i, Snake_points[i]);   if(max_curvature<curvature[i])    max_curvature=curvature[i];  }  avg_distance=0.0;  for(i=0;i<no_of_snake_points;i++)   curvature[i]=curvature[i]/max_curvature;  for(i=0;i<no_of_snake_points;i++)  {   avg_distance+=find_distance(i, Snake_points[i]);   if(curvature[i]>threshold_curvature&&curvature[i]>curvature[(i+1)%no_of_snake_points]&&curvature[i]>curvature[(i-1+no_of_snake_points)%no_of_snake_points])    *(beta+i)=0;  }  if(movement<threshold_movement)   termination_point=true;  iteration++;  if(iteration>Max_Iterations)   termination_point=true; } delete alpha; delete beta; delete gamma; delete curvature;}double find_distance(int no, CPoint point){ int x=no_of_snake_points; point-=Snake_points[(no-1+x)%x]; return(sqrt(point.x*point.x+point.y*point.y));}double find_curvature(int no, CPoint point){ int x=no_of_snake_points; point=Snake_points[(no-1+x)%x]-point-point+Snake_points[(no+1)%x]; return(point.x*point.x+point.y*point.y);}double find_continuity(int no, CPoint point, double avg_distance){ return(pow(avg_distance-find_distance(no,point),2));}CPoint find_min_energy(int no, CPoint point, double avg_distance){ CPoint p, min_point; double max_curvature, max_continuity, max_internal, min_internal, min_energy, energy; double curvatures[5][5]; double continuities[5][5]; double internal_energies[5][5]; int i,j, limit=1; max_curvature=max_continuity=max_internal=-1000000000000.0; min_internal=1000000000000.0; if(!neighbor3by3)  limit++; for(i=-limit;i<=limit;i++) {  p.y=point.y+i;  if(p.y<0)   p.y=0;  if(p.y>=m_Rows)   p.y=m_Rows-1;  for(j=-limit;j<=limit;j++)  {   p.x=point.x+j;   if(p.x<0)    p.x=0;   if(p.x>=m_Cols)    p.x=m_Cols-1;   curvatures[i+limit][j+limit]=find_curvature(no, p); //This code can cause problem near   continuities[i+limit][j+limit]=find_continuity(no,p,avg_distance); //border of image   internal_energies[i+limit][j+limit]=(double)grad_mag[p.y][p.x];   if(curvatures[i+limit][j+limit]>max_curvature)    max_curvature=curvatures[i+limit][j+limit];   if(continuities[i+limit][j+limit]>max_continuity)    max_continuity=continuities[i+limit][j+limit];   if(internal_energies[i+limit][j+limit]>max_internal)    max_internal=internal_energies[i+limit][j+limit];   if(internal_energies[i+limit][j+limit]<min_internal)    min_internal=internal_energies[i+limit][j+limit];  } } for(i=0;i<=2*limit;i++) {  for(j=0;j<=2*limit;j++)  {   curvatures[i][j]=curvatures[i][j]/max_curvature;   continuities[i][j]=continuities[i][j]/max_continuity;   internal_energies[i][j]=(internal_energies[i][j]-min_internal)/(max_internal-min_internal);  } } min_point.x=-limit; min_point.y=-limit; min_energy=1000000000000.0; for(i=-limit;i<=limit;i++) {  for(j=-limit;j<=limit;j++)  {   energy=*(alpha+no)*continuities[i+limit][j+limit]+*(beta+no)*curvatures[i+limit][j+limit]-*(gamma+no)*internal_energies[i+limit][j+limit];   if(energy<min_energy||(energy==min_energy&&i==0&&j==0))   {    min_energy=energy;    min_point.x=j;    min_point.y=i;   }  } } min_point.x=min_point.x+point.x; min_point.y=min_point.y+point.y; return(min_point);}/参考资料：[1] Williams. Donna and Shah. Mubarak. "A Fast Algorithm for Active Contours and Curvature Estimation", CVGIP: Image Understanding. Vol. 55, No. 1, January 1992. pp. 14-26. [2] M. Kass, A. Witkin, D. Terzopoulos. Snake: Active Contour Models. International Journal of Computer Vision. Vol.1, No.4, pp.321-331, 1988.             给我老师的人工智能教程打call！http://blog.csdn.net/jiangjunshow


展开全文
• matlab snake 算法，边界跟踪的一种算法
• snake算法进行边缘检测
• Snake 算法或Active Contour Models。这类算法需要给出初始的轮廓，然后进行迭代，使轮廓沿能量降低的方向靠近，最后得到一个优化的边界。能量函数包括内外力两方面，如边界曲率 和梯度。由于用户无法估计迭代的最后...

http://blog.csdn.net/byxdaz/archive/2006/04/18/667432.aspx
Snake 算法或Active Contour Models。这类算法需要给出初始的轮廓，然后进行迭代，使轮廓沿能量降低的方向靠近，最后得到一个优化的边界。能量函数包括内外力两方面，如边界曲率 和梯度。由于用户无法估计迭代的最后结果，应用Snake 算法往往需要进行多次的交互工作。特别当目标比较复杂时，或与其它物体靠得较近时，初始的轮廓不易确定，而迭代的结果往往不能达到要求。
/CODE:/
bool termination_pointbool neighbor3by3; /* true means 3x3 neighborhood, false means 5x5 neighborhood */int grad_mag[500][500];	/* Magnitude of Gradient */int m_Cols; /* Number of Columns */int m_Rows; /* Number of Rows */int no_of_snake_points;CPoint Snake_points[200]; /* Snake Points */double *alpha,*beta, *gamma; /* Weights for energies */double threshold_curvature; int threshold_movement;void Snake_algorithm() {bool flag_change;int movement,i,j,iteration=0;double avg_distance=0.0, max_curvature;CPoint temp;double *curvature;	alpha=new double[no_of_snake_points];beta=new double[no_of_snake_points];gamma=new double[no_of_snake_points];curvature=new double[no_of_snake_points];termination_point=false;for(i=0;i<no_of_snake_points;i++){*(alpha+i)=1.0;*(beta+i)=1.0;*(gamma+i)=1.2;avg_distance+=find_distance(i, Snake_points[i]);}j=no_of_snake_points;pdc=GetDC();while(!termination_point){movement=0;avg_distance=avg_distance/(double)no_of_snake_points;max_curvature=-1000000000.0;for(i=0;i<no_of_snake_points;i++){temp=find_min_energy(i, Snake_points[i],avg_distance);flag_change=false;if(temp!=Snake_points[i]&&temp!=Snake_points[(i-1+j)%j]&&temp!=Snake_points[(i+1)%j]){Snake_points[i]=temp;movement++;}curvature[i]=find_curvature(i, Snake_points[i]);if(max_curvature<curvature[i])max_curvature=curvature[i];}avg_distance=0.0;for(i=0;i<no_of_snake_points;i++)curvature[i]=curvature[i]/max_curvature;for(i=0;i<no_of_snake_points;i++){avg_distance+=find_distance(i, Snake_points[i]);if(curvature[i]>threshold_curvature&&curvature[i]>curvature[(i+1)%no_of_snake_points]&&curvature[i]>curvature[(i-1+no_of_snake_points)%no_of_snake_points])*(beta+i)=0;}if(movement<threshold_movement)termination_point=true;iteration++;if(iteration>Max_Iterations)termination_point=true;}delete alpha;delete beta;delete gamma;delete curvature;}double find_distance(int no, CPoint point){int x=no_of_snake_points;point-=Snake_points[(no-1+x)%x];return(sqrt(point.x*point.x+point.y*point.y));}double find_curvature(int no, CPoint point){int x=no_of_snake_points;point=Snake_points[(no-1+x)%x]-point-point+Snake_points[(no+1)%x];return(point.x*point.x+point.y*point.y);}double find_continuity(int no, CPoint point, double avg_distance){return(pow(avg_distance-find_distance(no,point),2));}CPoint find_min_energy(int no, CPoint point, double avg_distance){CPoint p, min_point;double max_curvature, max_continuity, max_internal, min_internal, min_energy, energy;double curvatures[5][5];double continuities[5][5];double internal_energies[5][5];int i,j, limit=1;max_curvature=max_continuity=max_internal=-1000000000000.0;min_internal=1000000000000.0;if(!neighbor3by3)limit++;for(i=-limit;i<=limit;i++){p.y=point.y+i;if(p.y<0)p.y=0;if(p.y>=m_Rows)p.y=m_Rows-1;for(j=-limit;j<=limit;j++){p.x=point.x+j;if(p.x<0)p.x=0;if(p.x>=m_Cols)p.x=m_Cols-1;curvatures[i+limit][j+limit]=find_curvature(no, p); //This code can cause problem nearcontinuities[i+limit][j+limit]=find_continuity(no,p,avg_distance);	//border of imageinternal_energies[i+limit][j+limit]=(double)grad_mag[p.y][p.x];if(curvatures[i+limit][j+limit]>max_curvature)max_curvature=curvatures[i+limit][j+limit];if(continuities[i+limit][j+limit]>max_continuity)max_continuity=continuities[i+limit][j+limit];if(internal_energies[i+limit][j+limit]>max_internal)max_internal=internal_energies[i+limit][j+limit];if(internal_energies[i+limit][j+limit]<min_internal)min_internal=internal_energies[i+limit][j+limit];}}for(i=0;i<=2*limit;i++){for(j=0;j<=2*limit;j++){curvatures[i][j]=curvatures[i][j]/max_curvature;continuities[i][j]=continuities[i][j]/max_continuity;internal_energies[i][j]=(internal_energies[i][j]-min_internal)/(max_internal-min_internal);}}min_point.x=-limit;min_point.y=-limit;min_energy=1000000000000.0;for(i=-limit;i<=limit;i++){for(j=-limit;j<=limit;j++){energy=*(alpha+no)*continuities[i+limit][j+limit]+*(beta+no)*curvatures[i+limit][j+limit]-*(gamma+no)*internal_energies[i+limit][j+limit];if(energy<min_energy||(energy==min_energy&&i==0&&j==0)){min_energy=energy;min_point.x=j;min_point.y=i;}}}min_point.x=min_point.x+point.x;min_point.y=min_point.y+point.y;return(min_point);}/
参考资料：[1] Williams. Donna and Shah. Mubarak. "A Fast Algorithm for Active Contours and Curvature Estimation", CVGIP: Image Understanding. Vol. 55, No. 1, January 1992. pp. 14-26. [2] M. Kass, A. Witkin, D. Terzopoulos. Snake: Active Contour Models. International Journal of Computer Vision. Vol.1, No.4, pp.321-331, 1988.

展开全文
• 基于GVF的snake算法模型，用matlab实现。有例子和源代码及demo 基于GVF的snake算法模型，用matlab实现。有例子和源代码及demo
• 利用snake算法实现数字图像的边缘检测，图像分割以及特征提取！！
• 使用snake算法实现active contour。在灰度图像中，标点完成选取大的外围边界。算法自动实现边界自动收缩至物体边缘。整个算法使用MATLAB实现。压缩文件中包含代码和报告。报告包含算法实现的相关介绍。测试图片可以...
• 基于matlab的经典snake算法 ，可用来学习，处理一些图像，具体自己可以看看
• python版本的形态学snake算法，里面包含测试图片，可以运行测试
• MSRM和Snake算法相结合的MRI肿瘤提取
• 为了进一步提高乳腺肿瘤分割的精确度,提出了一种基于简单线性迭代聚类(SLIC)和梯度矢量流(GVF)Snake算法相结合的乳腺肿瘤分割模型。该模型首先对图像进行预处理以减少冗余信息提高后续的分割效率;其次结合图像的纹理...
• Snake算法所有模型的论文，中文和英文的都有，我在文件名前都加了标记～
• Snake算法 snake是一种主动轮廓模型，主动轮廓模型目前用到了2种：CV和snake。snake在逐步迭代优化过程的目标是能量函数最小化，snake的目标不像sobel、canny等找到整张图的轮廓。它只搜索你给出的初始轮廓附近，...
Snake算法

snake是一种主动轮廓模型，主动轮廓模型目前用到了2种：CV和snake。snake在逐步迭代优化过程的目标是能量函数最小化，snake的目标不像sobel、canny等找到整张图的轮廓。它只搜索你给出的初始轮廓附近，达到轮廓更精确的目标，至少原版的snake只能达到局部优化的目标。

因为曲线曲率的关系，闭合的轮廓曲线中，凸曲线按照法向量的方向，具有向内的作用力；凹曲线法向量向外，具有向外的力。而曲率计算就是跟一阶导数、二阶导数相关的。

在迭代过程中，弹性能量能快速的把轮廓压缩成光滑的圆；弯曲能量将轮廓拉成光滑的曲线或直线，他们的作用是保持轮廓的光滑和连续性。通常alpha越大，轮廓收敛越快；beta越大，轮廓越光滑。

通常梯度高的位置都是图像中前景与背景的界限或者物体与物体之间、物体内部不同部分的界限，适合用于分割。外部能量会使轮廓朝（灰度）高梯度位置靠近。

Snake目前主流的图像分割方法，曲线演化理论如下图，曲线存在曲率，曲率有正有负，于是在法向曲率力的推动下，曲线的运动方向之间有所不同：有些部分朝外扩展，而有些部分则朝内运动。这种情形如下图所示。图中蓝色箭头处的曲率为负，而绿色箭头处的曲率为正。

粗略表示为Esnake=Vs+Vss+Eext；可以认为当Esnake的能量达到最小时snake曲线和物体的边缘一致。

Snake主要原理是先提供待分割图像的一个初始轮廓的位置，并对其定义个能量函数，是轮廓沿能量降低的方向靠近。当能量函数达到最小的时候，提供的初始轮廓收敛到图形中目标的真实轮廓。

Snake能量函数是有内部能量函数和外部能量函数组成，内部能量控制轮廓的平滑性和连续性，外部能量由图像能量和约束能量组成，控制轮廓向着实际轮廓收敛，其中约束能量可根据具体的对象形态定义，使得snake具有很大的灵活性。

Snake模型主要研究的方面：

1.表示内部能量的曲线演化    2.外力    3.能量最小化

由于snake模型对于初始位置比较敏感，因此要求初始轮廓尽可能的靠近真实轮廓，而当图像边缘模糊，目标比较复杂或与其他的物体靠的比较近时，其初始轮廓更不易确定。

应用snake的优势：由于生物或人体组织解剖结构的复杂性，以及软组织形状的易变性，那些仅依赖于图像本身的灰度，纹理属性等低层次视觉属性来进行分割的图像分割方法难以获得理想的分割效果，因此医学图像分割迫切需要有一种灵活的框架，能将基于图像本身低层次视觉属性（边缘，纹理，灰度，色彩）和人们对于待分割目标的知识经验，如目标形状的描述，亮度，色彩的经验统计，医生的经验等，可以一种有机的方式整合起来，得到待分割区域的完整表达。

展开全文
• Deep Snake算法建立在传统Snake算法的基础上，将snake算法做成了轮廓结构化特征学习的方法，使用了循环卷积取得了比通用的图卷积能更好的挖掘轮廓的周期图结构。 Deep Snake算法克服了建立在图像检测器给出便捷...
  第一部分：创新及其优点

第二部分：算法原理

第三部分：实验过程

第四部分：程序逻辑

1 创新及其优点

Deep Snake算法建立在传统Snake算法的基础上，将snake算法做成了轮廓结构化特征学习的方法，使用了循环卷积取得了比通用的图卷积能更好的挖掘轮廓的周期图结构。

Deep Snake算法克服了建立在图像检测器给出便捷方框不准确造成实例分割产生误差的缺陷；优化了将图像边框表示成密集二进制带来复杂的后期处理的缺点；同时相比在RGB图中进行轮廓回归更充分的利用了轮廓的特殊拓扑。

2 算法原理

snake是一种主动轮廓模型，它需要一个初始轮廓，以其为输入进行逐步迭代，从而达到调整图像轮廓使其更精确的目的。

snake在逐步迭代优化过程中的目标是能量函数最小化，这个能量函数值轮廓能量和图像能量的总和，其能量函数如下：

指当前轮廓本身能量(内部能量)， 指图像轮廓对应点的能量(外部能量), 表示其方差的相关项。其中内部能量由两部分组成：一阶导数的模（称为弹性能量）和二阶导数的模（弯曲能量）

其中内部能量由两部分组成：一阶导数的模（称为弹性能量）和二阶导数的模（弯曲能量）[这里需要记住为什么]，在迭代过程中，弹性能量能快速的把轮廓压缩成光滑的圆；弯曲能量将轮廓拉成光滑的曲线或直线，他们的作用是保持轮廓的光滑和连续性。通常alpha越大，轮廓收敛越快；beta越大，轮廓越光滑。

外部图像能量分三种：线性能量(通常更亮度相关)；边缘能量(图像的边缘组成)；终端能量。在迭代优化过程中，外部能量会使轮廓朝（灰度）高梯度位置靠近。而通常梯度高的位置都是图像中前景与背景的界限或者物体与物体之间、物体内部不同部分的界限，适合用于分割。在逐步迭代优化过程中的目标是能量函数最小化，这就是snake算法调整实例轮廓的方法和过程。

Deep Snake与snake算法类似,分割实例分为两步:初始化轮廓和轮廓变形，然后进行迭代使得实列分割边界更加准确。
（1） 初始化轮廓：检测包围框初始边缘上的四个中性点的菱形轮廓，然后以菱形为输入,输出四个顶点到对象极值的偏量，构造出八边形作为初始轮廓。
（2） 轮廓变形：先沿初始化八角形轮廓均匀的采样N个点，通过学习特征和顶点坐标的级联[F(xi):xi](F是特征映射)构造顶点xi得输入特征。在给定轮廓上定义的输入特征后移入特征学习的循环卷积，得到轮廓的输出特征并预测轮廓点与目标点之间的偏移，最后进行不断迭代得到实例的更优轮廓。从而解决了传统snake算法中只能达到局部最优的缺点

不同于snake算法的是，snake算法将顶点的坐标作为一组变量并将变量用于优化能量函数中使其中最小进而达到调整轮廓的目的，而deep snake直接学会以端到端的方式进行轮廓变形.

循环卷积不同于线性卷积的一种卷积运算，是周期卷积的一种。其公式如下：

循环卷积

RN(n)代表只取长度为n的主值序列，其计算过程如下：

蓝色为输入特征、黄色为核函数，令右图所示状态为

n=0，将输入特征变量与核函数变量做乘积得到输出

变量y(0),当n=1时，将核函数逆时针旋转一个单位得

到y(1),不断旋转直到算出y(n)，这样就算出了输入轮

廓的输出特征，最后根据输出特征对初试轮廓进行

调整，从而完成deep snake算法第二步。

值得一提的是由于实例轮廓多是封闭的回路，因此这里运用循环卷积比一般卷积更能运用这种特殊的拓扑结构。

3 实验过程

4 程序逻辑

以上就是本人对deep Snake相关知识点的创新、原理、实验过程、程序逻辑的个人看法，欢迎指正。


展开全文
• 包含了两个VC程序，里面有详细的源码，还有SNAKE算法的中英文资料。
• 基于模拟退火思想的snake算法，王子奇，朱良峰，随着近年遥感影像分辨率的增加，对于遥感影像中的地物识别成为了遥感影像分析中的基础工作。而主动边缘轮廓搜索算法（Snake）利用�
• 针对经典Snake算法以及GVF Snake算法容易受到图像噪声点的干扰而无法正确逼近目标物体边界的问题，提出了一种新的Snake外力场——通过边缘映射图的卷积方式扩展形成的梯度卷积外力场GCF。实验证明，基于这种GCF外力...
• 本文件是基于GVF的snake算法模型，内容完整；用matlab实现。文件中包含例子、源代码和demo。
• 在计算光流场的基础上，提出了snake算法中一种新的外部能量函数，并利用光流场的运动矢量来预测下帧图像中snake的初始值，不仅与无预测的算法相比能提高收敛的速度，而且收敛结果更贴近于目标的本身。实验证明了该文...
• 图像的边缘检测对图像的分割、图像信息的提取等都非常重要...利用àtrous小波变换、图像块生长和wavelet snake算法相结合，本文提出了一种检测SAR图像中河岸边缘的新算法，并成功用于提取淮河SAR图像中的一段水岸边缘。
• ## snake算法总结

万次阅读 多人点赞 2018-06-07 14:08:45
snake是一种主动轮廓模型，笨妞...前者没有看算法内部的原理。而snake，以最原始的论文《Snakes: Active Contour Models》为出发点。1. snake原理snake在逐步迭代优化过程的目标是能量函数最小化，这个能量函数指的...
• 改进的snake算法将对轮廓检测十分有用。这是一篇关于改进snake算法的论文。
• snake算法的vc++实现代码！ 能够运行，速度很快。

...