无重初始化的水平集进化:新变分公式与优势

需积分: 10 7 下载量 8 浏览量 更新于2024-07-20 1 收藏 332KB PDF 举报
"本文介绍了一种无需重新初始化的水平集进化方法——DRLSE模型,通过新的变分公式,使得水平集函数接近符号距离函数,从而避免了繁琐的重新初始化步骤。该方法包括内部和外部能量项,前者惩罚水平集与符号距离函数的偏差,后者推动零水平集向图像目标特征移动。此方法可使用较大时间步长,适用于一般函数初始化,且能通过简单有限差分方案快速计算,已在模拟和真实图像中得到验证并表现出良好的效果。文章还对比了参数活动轮廓模型和几何活动轮廓模型,强调了水平集方法在处理拓扑变化和数字化方案方面的优势。" 详细说明: 水平集方法是一种用于几何形状的建模和演化的技术,尤其在图像处理和计算机视觉领域有着广泛的应用。Osher和Sethian首次引入水平集方法,主要用于追踪运动前沿。活动轮廓模型,又称为 Snake,由Kass等人提出,用于图像分割。 根据表示和实现方式,活动轮廓模型可以分为参数活动轮廓和几何活动轮廓。参数活动轮廓是显式表示的参数曲线,而几何活动轮廓则是隐式表示的,以二维函数的水平集形式存在,由Caselles和Malladi等人的工作推动发展。 本文提出的DRLSE模型属于几何活动轮廓的范畴,但其创新之处在于提供了一个新的变分水平集公式,无需对水平集函数进行重新初始化。传统的水平集方法常常需要在演进过程中保持水平集函数为符号距离函数,这一步骤被称为重新初始化,而DRLSE模型通过内部和外部能量项的设定,自然地实现了这一目标,减少了计算复杂性。 内部能量项用于保持水平集函数与符号距离函数的一致性,而外部能量项则驱动零水平集向图像的目标特征移动,例如目标边界。这种新方法允许使用更大的时间步长进行演化,提高了计算效率,而且初始化时可以采用一般函数,比符号距离函数更为灵活。此外,DRLSE模型的计算过程可以通过简单的有限差分方案实现,进一步提升了计算速度。 在实际应用中,DRLSE模型已被用于模拟和真实图像的处理,并取得了良好的结果。这表明该模型不仅在理论上具有优势,而且在实践中也有很高的实用价值,尤其是在处理涉及轮廓分裂、融合和拓扑变化的复杂情况时,展示了水平集方法的优势。

import pygame, sys, time, random width=102 #面板的宽度(外围有一层墙) high=102 #面板的高度(外围有一层墙) size=6 #设置绘制的单方格大小 def initialization(arr): #初始化 for i in range(high): for j in range(width): ran=random.random() if ran>0.9: arr[i][j]=1 else: pass return arr def nextmultiply(arr): #下一代繁衍 newarr = [([0] * width) for n in range(high)] for i in range(high): for j in range(width): num=0 if (i==0 or i==high-1) or (j==0 or j==width-1): newarr[i][j]=0 else: num=arr[i-1][j-1]+arr[i-1][j]+arr[i-1][j+1]+arr[i][j-1]+arr[i][j+1]+arr[i+1][j-1]+arr[i+1][j]+arr[i+1][j+1] if arr[i][j]==0: #若原细胞为死亡状态 if num==3: newarr[i][j]=1 else: #若原细胞为存活状态 if num==2 or num==3: newarr[i][j]=1 else: newarr[i][j]=0 return newarr if name == 'main': color_white = pygame.Color(255, 255, 255) color_LightSkyBlue = pygame.Color(135,206,250) color_black = pygame.Color(0, 0, 0) pygame.init() screen = pygame.display.set_mode((widthsize, highsize)) screen.fill(color_white) pygame.display.set_caption("生命游戏Game of Life") arr = [([0] * width) for i in range(high)] # 创建一个二维数组 arr=initialization(arr) while(True): screen.fill(color_white) time.sleep(0.5) for i in range(high): for j in range(width): if arr[i][j]==1: pygame.draw.rect(screen, color_black, (i * size, j * size, size, size)) elif (i==0 or i==high-1) or (j==0 or j==width-1): pygame.draw.rect(screen, color_LightSkyBlue, (i * size, j * size, size, size)) else: pass for event in pygame.event.get(): # 监听器 if event.type == pygame.QUIT: sys.exit() arr = nextmultiply(arr) pygame.display.update()1.3中各个函数和类输入、输出和功能

2023-06-12 上传