主动轮廓模型——Snake分割算法(MATLAB)

article/2025/11/7 15:50:29

学习图像分割算法,在网上找到的关于主动轮廓模型的实现代码,自己简化总结了一下,在这里和大家分享,欢迎提问

snake是一种能量最小的曲线,表示为v(s) = (x(s), y(s)), s为归一化的曲线长度,s∈[0, 1]。

能量函数由曲线内部能量和外部约束力(图像力)组成, 表示为 Esnake =  Esnake(v(s))ds

                                                                                = ∫( Eint(v(s))  +  Eimage(v(s)) )ds

                                                                                      曲线内部能量        图像力         

 内部能量分为弹性势能和弯曲势能两部分:

                                                                Eint = (α(s)|vs(s)|^2 + β(s)|Vss(s)|^2)/2

                                                                              弹性势能             弯曲势能

vs(s)是曲线的一阶导数;Vss(s)是曲线的二阶导数。假设Vi = (xi, yi),  i=0,1,…,n-1;

vs(s) = (vi+1 - vi-1)/2;

vss(s) ≈ ((vi+1 -vi) - (vi - vi-1))  = vi+1 - 2vi +vi-1;

所以 Eint = ∑α|vi+1 - vi| + β|vi+1 - 2vi +vi-1|^2 ;

图像力分为三部分,分别驱使snake趋向于lines(线),edges(边),termination(终端)

        Eimage = wlineEline + wedgeEedge + wtermEterm

           一般设定Eline为图像强度,Eedge为亮度的梯度变化;

        Eline = I(x,y);

        Eedge = -|▽I(x,y)|^2;

        C(x,y)为高斯滤波后的图像,θ是(x,y)处的梯度角度;

                    C(x,y) = Gσ(x,y) * I(x,y);

                    tanθ = Cy / Cx;

        规定 n = (cosθ,  sinθ ) , n⊥ = (-sinθ , cosθ)

        则, 终端的能量函数定义为:

                          

综上,

目标轮廓的确定就转化为极小化如下的能量泛函的问题

Esnake = ∫((α(s)|vs(s)|^2 + β(s)|Vss(s)|^2)/2  + Eimage) ds

求解能量的极小化是一个典型的变分问题,依据变分法的原理将其转化为欧拉公式,将变分问题转化为微分问题,进而求得极小值

%读入图像I = imread('sample.tif');
Igs = im2double(I);
figure,imshow(Igs)%手动获取snake轮廓点
x=[];y=[];c=1;N=100;
while c<N[xi,yi,button] = ginput(1); %%精确获取轮廓点x = [x, xi];  %将获取的点存入x,y集合y = [y, yi];hold on;plot(xi,yi,'ro');if(button == 3), %当点击鼠标右键时,取点停止break; endc = c+1;
end
%将第一个点复制到最后,构成完整的轮廓结构
xy = [x;y];
c = c+1;
xy(:,c) = xy(:,1);
%对轮廓线进行插值
t = 1:c;
ts = 1:0.1:c;
xys = spline(t,xy,ts);
xs = xys(1,:); %初始取点横坐标
ys= xys(2,:); %初始取点纵坐标
%查看插值效果
hold on
temp = plot(x(1),y(1),'ro',xs,ys,'b.');
legend(temp, '原点', '插值点');
%%snake算法主体部分
%图像力——线函数
Eline = Igs; %原图像
%图像力——边函数
[gx, gy] =gradient(Igs);
Eedge = -1* sqrt((gx.*gx+gy.*gy)); %梯度图像
%图像力——终点函数
m1 = [-1,1];
m2 = [-1;1];
m3 = [-1,-2,1];
m4 = [-1;-2;1];
m5 = [1,-1;-1,1];
cx = conv2(Igs, m1, 'same');
cy = conv2(Igs, m2, 'same');
cxx = conv2(Igs, m3, 'same');
cyy = conv2(Igs, m4, 'same');
cxy = conv2(Igs, m5, 'same');
[row, col] = size(Igs);
for i = 1:rowfor j = 1:colEterm(i,j) =(cyy(i,j)*cx(i,j)*cx(i,j) + cxx(i,j)*cy(i,j)*cy(i,j) -2*cxy(i,j)*cx(i,j)*cy(i,j))/(1+cx(i,j)*cx(i,j)+cy(i,j)*cy(i,j)^1.5);end
end
wl=0; we=0.4; wt=0;
%计算外部力
Eext = wl*Eline + we*Eedge + wt*Eterm;
%计算梯度
[fx, fy] = gradient(Eext);
%计算五对角状矩阵
xs = xs'; %初始取点横坐标集合转换为列向量
ys = ys';
[m,n] = size(xs);
[mm,nn] = size(fx);
alpha=0.2; beta=0.2; gama=1; kappa=0.1;
b(1)=beta;
b(2)=-(alpha + 4*beta);
b(3)=(2*alpha + 6*beta);%%b(i) 表示v(i)系数,从(i-2)到(i+2)
b(4)=b(2);
b(5)=b(1);
A = b(1)*circshift(eye(m),2);
A = A + b(2)*circshift(eye(m),1);
A = A + b(3)*circshift(eye(m),0);
A = A + b(4)*circshift(eye(m),-1);
A = A + b(5)*circshift(eye(m),-2);
%计算矩阵的逆
[L U] = lu(A+gama.*eye(m));
Ainv = inv(U) * inv(L);
% 画图部分
NIter = 1000;
figure
for i = 1:NIter;ssx = gama*xs - kappa*interp2(fx,xs,ys);ssy = gama*ys - kappa*interp2(fy,xs,ys);%计算新的轮廓点位置xs = Ainv*ssx;ys = Ainv*ssy;imshow(I)hold on;plot([xs; xs(1)],[ys; ys(1)], 'r-');hold off;pause(0.001)
end

参考博客:https://blog.csdn.net/special00/article/details/108768457?utm_medium=distribute.pc_relevant_bbs_down.none-task-blog-baidujs-1.nonecase&depth_1-utm_source=distribute.pc_relevant_bbs_down.none-task-blog-baidujs-1.nonecase

 

 


http://chatgpt.dhexx.cn/article/2ieLjle2.shtml

相关文章

麻雀搜索算法(Sparrow Search Algorithm,SSA)

文章目录 1 算法思想2 算法步骤3 求解函数最值&#xff08;Python实现&#xff09;4 算法进阶直接改进SSA融合别的智能优化算法来改进SSASMA及其改进的应用 原论文&#xff1a; [1]薛建凯. 一种新型的群智能优化技术的研究与应用[D].东华大学,2020. 1 算法思想 借鉴生物行为&a…

CVPR2020分割算法Deep Snake的配置(Deep Snake for Real-Time Instance Segmentation)

这篇文章为分割提供了新思路&#xff0c;很有参考意义。 注&#xff1a;原代码的运行环境为Ubuntu&#xff0c;本文在Windows10系统下完成配置。 1、论文下载&#xff1a; Deep Snake for Real-Time Instance Segmentation [paper][code] 2、代码下载&#xff1a; https:/…

图像分割之(五)活动轮廓模型之Snake模型简介

图像分割之&#xff08;五&#xff09;活动轮廓模型之Snake模型简介 zouxy09qq.com http://blog.csdn.net/zouxy09 在“图像分割之&#xff08;一&#xff09;概述”中咱们简单了解了目前主流的图像分割方法。下面咱们主要学习下基于能量泛函的分割方法。这里学习下Snake模型…

麻雀搜索算法SSA(Sparrow Search algorithm)

文章目录 前言数学模型 前言 麻雀搜索算法是2020提出的一种新的优化算法&#xff0c;出自东华大学xue和shen的论文&#xff1a;A novel swarm intelligence optimization approach: sparrow search algorithm&#xff0c;本文的内容是基于该论文来写的。 数学模型 麻雀搜索算…

snake 模型

转自&#xff1a;https://blog.csdn.net/caoniyadeniniang/article/details/77803002 一、曲线演化理论 假设CC(p)是一条光滑封闭的曲线&#xff0c;P是任意的参数化变量&#xff0c;设K表示曲 率&#xff0c;T表示切线&#xff0c;N表示法线&#xff0c;则有如下关系存在&…

蛇优化算法(Snake Optimization,SO)(附Matlab代码,完整,免费)

蛇优化算法&#xff08;Snake Optimization&#xff0c;SO&#xff09;&#xff08;附Matlab代码&#xff0c;完整&#xff0c;免费&#xff09; 一、算法灵感二、算法介绍2.1 初始化2.2 划分种群2.3 定义温度和食物2.4 食物不足时(探索阶段)2.5 食物充足时(开发阶段)2.5.1 斗争…

snake模型求解

&#xfeff;&#xfeff; snake 模型 一、曲线演化理论 假设CC(p)是一条光滑封闭的曲线&#xff0c;P是任意的参数化变量&#xff0c;设K表示曲 率&#xff0c;T表示切线&#xff0c;N表示法线&#xff0c;则有如下关系存在&#xff1a; 因为T和N是互相垂直的(如图所示)&am…

snake模型

1 能量泛函 在介绍snake模型的参考资料[1]中&#xff0c;提到能量泛函的概念&#xff0c;这里对此概念做一个总结。 参考资料[6]给出了泛函的定义&#xff1a; 简单的说&#xff0c; 泛函就是定义域是一个函数集&#xff0c;而值域是实数集或者实数集的一个子集。推广开来&…

Snake算法知识点记录

Snake算法 snake是一种主动轮廓模型&#xff0c;主动轮廓模型目前用到了2种&#xff1a;CV和snake。snake在逐步迭代优化过程的目标是能量函数最小化&#xff0c;snake的目标不像sobel、canny等找到整张图的轮廓。它只搜索你给出的初始轮廓附近&#xff0c;达到轮廓更精确的目…

snake模型简介

图像分割之&#xff08;五&#xff09;活动轮廓模型之Snake模型简介 zouxy09qq.com http://blog.csdn.net/zouxy09 在“图像分割之&#xff08;一&#xff09;概述”中咱们简单了解了目前主流的图像分割方法。下面咱们主要学习下基于能量泛函的分割方法。这里学习下Snake模型简…

蛇优化算法(Snake Optimizer)

生物学机理&#xff1a;来源于蛇的交配行为。如果温度较低&#xff0c;且食物可用&#xff0c;蛇的交配行为发生&#xff1b;否则蛇只会寻找食物&#xff08;食物量<0.25&#xff09;或吃现有的食物(T>0.6)。基于此&#xff0c;将考虑蛇优化算法的搜索过程分为两个阶段&a…

图像处理之图像分割(一)之活动轮廓模型:Snake算法简单梳理

图像处理之图像分割&#xff08;一&#xff09;之活动轮廓模型&#xff1a;Snake算法简单梳理 Snake算法&#xff0c;应该也可以翻译成蛇形算法&#xff0c;或者是包含曲折前进的意思。具体函数背景原理介绍参考&#xff1a;zouxy09&#xff0c;http://blog.csdn.net/zouxy09/a…

snake算法总结

snake是一种主动轮廓模型&#xff0c;笨妞对主动轮廓模型的理解&#xff1a;你先给它一个初始轮廓&#xff0c;模型以初始轮廓为基准逐步迭代&#xff0c;来改进图像的轮廓&#xff0c;使其更加精确。主动轮廓模型目前用到了2种&#xff1a;CV和snake。前者没有看算法内部的原理…

主动轮廓模型:Snake模型的python实现

质量声明&#xff1a;原创文章&#xff0c;内容质量问题请评论吐槽。如对您产生干扰&#xff0c;可私信删除。 主要参考&#xff1a;Active Contour Model — skimage v0.16.dev0 docs - scikit-image 文章目录 skimage实现函数声明代码示例结果显示 Numpy实现代码示例结果显示…

社交网络分析--python-igraph

#coding:utf-8 import scrapy import xlwt, lxml import re, json import matplotlib.pyplot as plt import numpy as np import pylab from scipy import linalg #文档&#xff1a;igraph.org/python/doc/ #社交网络分析 #from igraph import *社交网络算法介绍 分析-权利的游…

(一文读懂社交网络分析(附应用、前沿、学习资源)学习笔记)

一文读懂社交网络分析&#xff08;附应用、前沿、学习资源&#xff09;学习笔记 一、社交网络的结构特性与演化机理1、社交网络结构分析与建模1.1 统计特性1.2 网络特性1.3 网络模型 2、虚拟社区以及发现技术2.1 定义2.2 社区发现算法评估指标2.3社区静态发现算法2.4 社区动态发…

推荐系统实践读书笔记-06利用社交网络数据

推荐系统实践读书笔记-06利用社交网络数据 自从搜索引擎谷歌诞生后&#xff0c;大家都在讨论互联网的下一个金矿是什么。现在&#xff0c;几乎所有的人都认为那就是社交网络。根据尼尔森2010年的报告&#xff0c;用户在互联网上22%的时间花费在社交网站和社交媒体上。Facebook…

超级干货 :一文读懂社交网络分析(附应用、前沿、学习资源)

转自&#xff1a;http://op.inews.qq.com/m/20171020B02CN500?refer100000355&chl_codekb_news_tech&h0 本文主要阐述&#xff1a; 社交网络的结构特性与演化机理 社交网络群体行为形成与互动规律 社交网络信息传播与演化机理 社交网络分析的应用 社交网络前沿研…

社交网络分析调研上

//2019年08月15日 文章来源&#xff1a;https://mp.weixin.qq.com/s/39_r3idlE3plqJwlhrvpAQ 一、相关概述 1、定义&#xff1a;“由许多节点构成的一种社会结构&#xff0c;节点通常是指个人或者组织&#xff0c;而社交网络代表着各种社会关系。” *在之前是社会学和人类学的…

社交网络影响力最大化

目录 1、社交网络概述 2、影响力最大化问题分类 3、社交网络影响力最大化作用 4、传播模型 4.1独立级联模型&#xff08;Independent Cascade Model&#xff09;简称 IC 模型 4.2线性阈值模型&#xff08;Linear Threshold Model&#xff09;简称LT模型 社交网络影响力最…