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

article/2025/11/7 18:14:42

质量声明:原创文章,内容质量问题请评论吐槽。如对您产生干扰,可私信删除。
主要参考:Active Contour Model — skimage v0.16.dev0 docs - scikit-image


文章目录

    • skimage实现
      • 函数声明
      • 代码示例
      • 结果显示
    • Numpy实现
      • 代码示例
      • 结果显示

skimage实现

函数声明

Active contours by fitting snakes to features of images. Supports single and multichannel 2D images. Snakes can be periodic (for segmentation) or have fixed and/or free ends. The output snake has the same length as the input boundary. As the number of points is constant, make sure that the initial snake has enough points to capture the details of the final contour.

active_contour(image, snake, alpha=0.01, beta=0.1, w_line=0, w_edge=1, gamma=0.01,bc='periodic', max_px_move=1.0, max_iterations=2500, convergence=0.1)Parameters----------image : (N, M) or (N, M, 3) ndarrayInput image.snake : (N, 2) ndarrayInitial snake coordinates. For periodic boundary conditions, endpointsmust not be duplicated.alpha : float, optionalSnake length shape parameter. Higher values makes snake contractfaster.beta : float, optionalSnake smoothness shape parameter. Higher values makes snake smoother.w_line : float, optionalControls attraction to brightness. Use negative values to attract towarddark regions.w_edge : float, optionalControls attraction to edges. Use negative values to repel snake fromedges.gamma : float, optionalExplicit time stepping parameter.bc : {'periodic', 'free', 'fixed'}, optionalBoundary conditions for worm. 'periodic' attaches the two ends of thesnake, 'fixed' holds the end-points in place, and 'free' allows freemovement of the ends. 'fixed' and 'free' can be combined by parsing'fixed-free', 'free-fixed'. Parsing 'fixed-fixed' or 'free-free'yields same behaviour as 'fixed' and 'free', respectively.max_px_move : float, optionalMaximum pixel distance to move per iteration.max_iterations : int, optionalMaximum iterations to optimize snake shape.convergence: float, optionalConvergence criteria.Returns-------snake : (N, 2) ndarrayOptimised snake, same shape as input parameter.References----------.. [1]  Kass, M.; Witkin, A.; Terzopoulos, D. "Snakes: Active contourmodels". International Journal of Computer Vision 1 (4): 321(1988). DOI:`10.1007/BF00133570`

代码示例

import numpy as np
from matplotlib import pyplot as plt
from skimage.color import rgb2gray
from skimage import data
from skimage.filters import gaussian
from skimage.segmentation import active_contourimg = data.astronaut() # 读入图像
img = rgb2gray(img) # 灰度化# 圆的参数方程:(220, 100) r=100
t = np.linspace(0, 2*np.pi, 400) # 参数t, [0,2π]
x = 220 + 100*np.cos(t)
y = 100 + 100*np.sin(t)# 构造初始Snake
init = np.array([x, y]).T # shape=(400, 2)# Snake模型迭代输出
snake = active_contour(gaussian(img,3), snake=init, alpha=0.1, beta=1, gamma=0.01, w_line=0, w_edge=10)# 绘图显示
plt.figure(figsize=(5, 5))
plt.imshow(img, cmap="gray")
plt.plot(init[:, 0], init[:, 1], '--r', lw=3)
plt.plot(snake[:, 0], snake[:, 1], '-b', lw=3)
plt.xticks([]), plt.yticks([]), plt.axis("off")
plt.show()

结果显示

astronaut:Active Contour Mode - Snake


Numpy实现

代码示例

import cv2 as cv
import numpy as np
from matplotlib import pyplot as pltdef getGaussianPE(src):"""描述:计算负高斯势能(Negative Gaussian Potential Energy, NGPE)输入:单通道灰度图src输出:无符号的浮点型单通道,取值0.0 ~ 255.0"""imblur = cv.GaussianBlur(src, ksize=(5, 5), sigmaX=3)dx = cv.Sobel(imblur, cv.CV_16S, 1, 0)  # X方向上取一阶导数,16位有符号数,卷积核3x3dy = cv.Sobel(imblur, cv.CV_16S, 0, 1)E = dx**2 + dy**2return Edef getDiagCycleMat(alpha, beta, n):"""计算5对角循环矩阵"""a = 2 * alpha + 6 * betab = -(alpha + 4 * beta)c = betadiag_mat_a = a * np.eye(n)diag_mat_b = b * np.roll(np.eye(n), 1, 0) + b * np.roll(np.eye(n), -1, 0)diag_mat_c = c * np.roll(np.eye(n), 2, 0) + c * np.roll(np.eye(n), -2, 0)return diag_mat_a + diag_mat_b + diag_mat_cdef getCircleContour(centre=(0, 0), radius=(1, 1), N=200):"""以参数方程的形式,获取n个离散点围成的圆形/椭圆形轮廓输入:中心centre=(x0, y0), 半轴长radius=(a, b), 离散点数N输出:由离散点坐标(x, y)组成的2xN矩阵"""t = np.linspace(0, 2 * np.pi, N)x = centre[0] + radius[0] * np.cos(t)y = centre[1] + radius[1] * np.sin(t)return np.array([x, y])def getRectContour(pt1=(0, 0), pt2=(50, 50)):"""根据左上、右下两个顶点来计算矩形初始轮廓坐标由于Snake模型适用于光滑曲线,故这里用不到该函数"""pt1, pt2 = np.array(pt1), np.array(pt2)r1, c1, r2, c2 = pt1[0], pt1[1], pt2[0], pt2[1]a, b = r2 - r1, c2 - c1length = (a + b) * 2 + 1x = np.ones((length), np.float)x[:b] = r1x[b:a + b] = np.arange(r1, r2)x[a + b:a + b + b] = r2x[a + b + b:] = np.arange(r2, r1 - 1, -1)y = np.ones((length), np.float)y[:b] = np.arange(c1, c2)y[b:a + b] = c2y[a + b:a + b + b] = np.arange(c2, c1, -1)y[a + b + b:] = c1return np.array([x, y])def snake(img, snake, alpha=0.5, beta=0.1, gamma=0.1, max_iter=2500, convergence=0.01):"""根据Snake模型的隐式格式进行迭代输入:弹力系数alpha,刚性系数beta,迭代步长gamma,最大迭代次数max_iter,收敛阈值convergence输出:由收敛轮廓坐标(x, y)组成的2xN矩阵, 历次迭代误差list"""x, y, errs = snake[0].copy(), snake[1].copy(), []n = len(x)# 计算5对角循环矩阵A,及其相关逆阵A = getDiagCycleMat(alpha, beta, n)inv = np.linalg.inv(A + gamma * np.eye(n))# 初始化y_max, x_max = img.shapemax_px_move = 1.0# 计算负高斯势能矩阵,及其梯度E_ext = -getGaussianPE(img)fx = cv.Sobel(E_ext, cv.CV_16S, 1, 0)fy = cv.Sobel(E_ext, cv.CV_16S, 0, 1)T = np.max([abs(fx), abs(fy)])fx, fy = fx / T, fy / Tfor g in range(max_iter):x_pre, y_pre = x.copy(), y.copy()i, j = np.uint8(y), np.uint8(x)try:xn = inv @ (gamma * x + fx[i, j])yn = inv @ (gamma * y + fy[i, j])except Exception as e:print("索引超出范围")# 判断收敛x, y = xn, ynerr = np.mean(0.5 * np.abs(x_pre - x) + 0.5 * np.abs(y_pre - y))errs.append(err)if err < convergence:print(f"Snake迭代{g}次后,趋于收敛。\t err = {err:.3f}")breakreturn x, y, errsdef main():src = cv.imread("circle.jpg", 0)img = cv.GaussianBlur(src, (3, 3), 5)# 构造初始轮廓线init = getCircleContour((140, 95), (110, 80), N=200)# Snake Modelx, y, errs = snake(img, snake=init, alpha=0.1, beta=1, gamma=0.1)plt.figure() # 绘制轮廓图plt.imshow(img, cmap="gray")plt.plot(init[0], init[1], '--r', lw=1)plt.plot(x, y, 'g', lw=1)plt.xticks([]), plt.yticks([]), plt.axis("off")plt.figure() # 绘制收敛趋势图plt.plot(range(len(errs)), errs)plt.show()if __name__ == '__main__':main()

结果显示

Snake迭代760次后,趋于收敛。	 err = 0.010
在这里插入图片描述在这里插入图片描述


http://chatgpt.dhexx.cn/article/LVaBJPkk.shtml

相关文章

社交网络分析--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模型 社交网络影响力最…

基于hadoop的社交网络三角形计数

图的三角形计数问题是一个基本的图计算问题,是很多复杂网络分析(比如社交网络分析) 的基础。目前图的三角形计数问题已经成为了 Spark 系统中 GraphX 图计算库所提供的一个算法级 API。本次实验任务就是要在 Hadoop 系统上实现 Twitter 社交网络图的三角形计数任务。 1.1 …

PageRank算法在社交网络上的应用

PageRank算法介绍 pagerank算法的核心思想是&#xff0c;计算一个用户随机点击一个网站然后不停点击从而到达各个网站的概率。而一个网站的打开概率又取决于那些指向他自己的那些网站的概率&#xff0c;所以这个概率的计算是一个不断迭代的过程。 一个简单的例子&#xff1a;…

社交网络与社会计算课程内容梳理总结

目录 1 引言2 复杂网络的图要素3 复杂网络度量4 复杂网络模型5 网络表示学习6 主题模型 1 引言 社会计算是指社会科学和计算技术交叉融合而成的一个研究领域&#xff0c;研究如何利用计算系统帮助人们进行沟通与协作&#xff0c;研究如何利用计算技术分析社会运行的规律与发展…

图论与复杂网络建模工具Networkx的四种网络模型

Networkx的四种网络模型 一. Networkx的下载安装二. 规则图三、ER随机图四、WS小世界网络五、BA无标度网络六. 总结 NetworkX提供了4种常见网络的建模方法&#xff0c;分别是&#xff1a;规则图&#xff0c;ER随机图&#xff0c;WS小世界网络和BA无标度网络。 一. Networkx的下…

社交网络分析算法应用,社交网络分析算法

社交网络的起源&#xff0c;发展历程及未来的发展趋势。越详细越好啊&#xff0c;多谢了各位 社交网络的起源六度分割原理及社交网络的兴起与发展有一个数学领域的猜想&#xff0c;名为Six Degrees of Separation&#xff0c;中文翻译包括以下几种&#xff1a; 六度分割理论或…

PageRank与社交网络模型评估

&#xfeff;&#xfeff; SNS社交网络在近几年流行起来&#xff0c;并呈现出火爆的增长趋势。在仿制国外Facebook、twitter等成功先例的基础上&#xff0c;国内的人人网、新浪微博等一系列社交网络正风生水起。 &#xfeff; 这些社交网站表面上看起来十分普通和其他网站别无二…

基于社交网络的推荐

论文题目&#xff1a;Graph Neural Networks for Social Recommendation 文章解决的challenge&#xff1a; 1.We propose a novel graph neural network GraphRec, which can model graph data in social recommendations coherently; 将用户与物品交互矩阵&#xff0c;用户与用…

社交网络分析之关系图(原理+Python代码)

数据来源于天池赛题&#xff1a;零基础入门数据分析-学术前沿趋势分析 地址&#xff1a;https://tianchi.aliyun.com/competition/entrance/531866/information 一、原理介绍 社交网络分析是图关系挖掘的一个分支&#xff0c;通常以关系图的形式来展示人与人之间的关系网络。…

python绘制社会关系网络图_python画社交网络图

在图书馆的检索系统中&#xff0c;关于图书的信息里面有一个是图书相关借阅关系图。跟这个社交网络图是一样的&#xff0c;反映了不同对象间的关联性。利用python画社交网络图使用的库是 networkx import networkx as nx import matplotlib.pyplot as plt G nx.Graph() G.…

《关于动态社交网络建模和分析的教程》的读书笔记

** 一、The French-DeGroot model ** 1.模型介绍 描述了一个有n个个体的团体的意见形成的离散时间过程。 模型&#xff1a; x(k1)Wx(k),k0,1…&#xff08;2&#xff09;&#xff08;French提出&#xff09; &#xff08;3&#xff09; 参数含义&#xff1a; x1、x2、…xn&am…

社交网络模型

社交网络模型 1.空手道俱乐部模型 1.1 模型概述 空手道俱乐部模型是以一个34人的团体构成的网络拓扑模型&#xff0c;由于俱乐部创始人与空手道教练就学员学费产生分歧&#xff0c;导致俱乐部形成以这两人为首的两个团体。 1.2 俱乐部裂变前的图形和矩阵表示 1.2.1 俱乐部…

社交网络分析——信息传播模型(附带三个模型的python实现)

摘要&#xff1a;主要讲解一些基本的信息传播模型&#xff0c;以及IC模型、SI模型和SIR模型的python实现及可视化。 2021.10.06更新有需要的可以点击传送门 2020.09.26更新更新了SIR模型的实现&#xff0c;请点击传送门&#xff0c;就不放在这篇博客里了 2020.09.03更新更新了S…

MOODLE安装

https://baijiahao.baidu.com/s?id1648898834478394333&wfrspider&forpc

Moodle 安装的时候提示 original IP

在安装 Moodle 的时候提示下面的错误&#xff0c;导致安装不能进行。 Installation must be finished from the original IP address, sorry 这是因为第一次安装的时候访问的 IP 地址与系统中记录的不一致。 你可以登录使用的数据库后运行下面的 SQL UPDATE mdl_user set la…