Python--level set (水平集)和 chan-vese模型

2018年08月28日 10:51:54 GlassySky0816 阅读数:1604
 
 版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_38784098/article/details/82144106

level set :https://www.zhihu.com/question/22608763?sort=created

https://blog.csdn.net/xiangyong58/article/details/11876019

chan-vese模型(公式推导):https://blog.csdn.net/zhangchen1003/article/details/48930377

水平集(CV模型)代码:

  1.  
    import cv2
  2.  
    from pylab import*
  3.  
     
  4.  
    Image = cv2.imread('02.jpg', 1) # 读入原图
  5.  
    image = cv2.cvtColor(Image, cv2.COLOR_BGR2GRAY)
  6.  
    img = np.array(image, dtype=np.float64) # 读入到np的array中,并转化浮点类型
  7.  
     
  8.  
    # 初始水平集函数
  9.  
    IniLSF = np.ones((img.shape[0], img.shape[1]), img.dtype)
  10.  
    IniLSF[300:320, 300:320] = -1
  11.  
    IniLSF = -IniLSF
  12.  
     
  13.  
    # 画初始轮廓
  14.  
    Image = cv2.cvtColor(Image, cv2.COLOR_BGR2RGB)
  15.  
    plt.figure(1), plt.imshow(Image), plt.xticks([]), plt.yticks([]) # to hide tick values on X and Y axis
  16.  
    plt.contour(IniLSF, [0], color='b', linewidth=2) # 画LSF=0处的等高线
  17.  
    plt.draw(), plt.show(block=False)
  18.  
     
  19.  
     
  20.  
    def mat_math(intput, str):
  21.  
    output = intput
  22.  
    for i in range(img.shape[0]):
  23.  
    for j in range(img.shape[1]):
  24.  
    if str == "atan":
  25.  
    output[i, j] = math.atan(intput[i, j])
  26.  
    if str == "sqrt":
  27.  
    output[i, j] = math.sqrt(intput[i, j])
  28.  
    return output
  29.  
     
  30.  
     
  31.  
    # CV函数
  32.  
    def CV(LSF, img, mu, nu, epison, step):
  33.  
     
  34.  
    Drc = (epison / math.pi) / (epison*epison + LSF*LSF)
  35.  
    Hea = 0.5*(1 + (2 / math.pi)*mat_math(LSF/epison, "atan"))
  36.  
    Iy, Ix = np.gradient(LSF)
  37.  
    s = mat_math(Ix*Ix+Iy*Iy, "sqrt")
  38.  
    Nx = Ix / (s+0.000001)
  39.  
    Ny = Iy / (s+0.000001)
  40.  
    Mxx, Nxx = np.gradient(Nx)
  41.  
    Nyy, Myy = np.gradient(Ny)
  42.  
    cur = Nxx + Nyy
  43.  
    Length = nu*Drc*cur
  44.  
     
  45.  
    Lap = cv2.Laplacian(LSF, -1)
  46.  
    Penalty = mu*(Lap - cur)
  47.  
     
  48.  
    s1 = Hea*img
  49.  
    s2 = (1-Hea)*img
  50.  
    s3 = 1-Hea
  51.  
    C1 = s1.sum() / Hea.sum()
  52.  
    C2 = s2.sum() / s3.sum()
  53.  
    CVterm = Drc*(-1 * (img - C1)*(img - C1) + 1 * (img - C2)*(img - C2))
  54.  
     
  55.  
    LSF = LSF + step*(Length + Penalty + CVterm)
  56.  
    # plt.imshow(s, cmap ='gray'),plt.show()
  57.  
    return LSF
  58.  
     
  59.  
    # 模型参数
  60.  
    mu = 1
  61.  
    nu = 0.003 * 255 * 255
  62.  
    num = 20
  63.  
    epison = 1
  64.  
    step = 0.1
  65.  
    LSF = IniLSF
  66.  
    for i in range(1, num):
  67.  
    LSF = CV(LSF, img, mu, nu, epison, step) # 迭代
  68.  
    if i % 1 == 0: # 显示分割轮廓
  69.  
    plt.imshow(Image), plt.xticks([]), plt.yticks([])
  70.  
    plt.contour(LSF, [0], colors='r', linewidth=2)
  71.  
    plt.draw(), plt.show(block=False), plt.pause(0.01)

为什么上传图片这么麻烦。

一、文章参考

Chan T F, Vese L. Active contours without edges[J]. Image processing, IEEE transactions on, 2001, 10(2): 266-277.
1
二、公式推导过程

---------------------
作者:jonson_zc
来源:CSDN
原文:https://blog.csdn.net/zhangchen1003/article/details/48930377
版权声明:本文为博主原创文章,转载请附上博文链接!

chan-vese模型的更多相关文章

  1. Vuforia开发完全指南---不懂编程也能做AR程序

    不懂编程也能做AR程序 可能一听到要做AR程序,很多人都会想到这是程序员的事.如果不懂编程,不会写代码,是做不了AR程序的.其实,Vuforia的Unity SDK非常人性化,即使你不会编程,也能做出 ...

  2. Active Snake (Level Set 模型)

    前沿:最近由于大论文实验的原因,需要整理几种Snake方法,以比较道路提取效果.所以今天晚上就将电脑中的一些LBF Snake代码作一下分类定义.并给出效果.以便比较. 1. 原始的LBF Snake ...

  3. NS2仿真:公交车移动周期模型及性能分析

    NS2仿真实验报告3 实验名称:公交车移动周期模型及性能分析 实验日期:2015年3月16日~2015年3月21日 实验报告日期:2015年3月22日 一.实验环境(网络平台,操作系统,网络拓扑图) ...

  4. 【Unity Shader】Unity Chan的卡通材质

    写在前面 时隔两个月我终于来更新博客了,之前一直在学东西,做一些项目,感觉没什么可以分享的就一直没写.本来之前打算写云彩渲染或是Compute Shader的,觉得时间比较长所以打算先写个简单的. 今 ...

  5. (转)Go语言并发模型:使用 context

    转载自:https://segmentfault.com/a/1190000006744213 context golang 简介 在 Go http包的Server中,每一个请求在都有一个对应的 g ...

  6. go 语言之 生产者消费模型

    简易的生产者消费模型,通过管道[也可以理解为队列],管道是先进先出,主要是理解chan 生产者使用make将chan初始化,并且设置chan长度,如果不设置,生产者就写入不了通道 go 是使用线程开始 ...

  7. Unity Chan 3D Asset

    Unity Chan 3D Asset 我真的很久沒再家裡開unity,不過今天让我久违的開了 下载地址  :http://ref.gamer.com.tw/redir.php?url=http%3A ...

  8. golang学习笔记 ---面向并发的内存模型

    Go语言是基于消息并发模型的集大成者,它将基于CSP模型的并发编程内置到了语言中,通过一个go关键字就可以轻易地启动一个Goroutine,与Erlang不同的是Go语言的Goroutine之间是共享 ...

  9. 11 The Go Memory Model go语言内置模型

    The Go Memory Model go语言内置模型 Version of May 31, 2014 Introduction 介绍 Advice 建议 Happens Before 在发生之前 ...

随机推荐

  1. BSGS&ExBSGS

    BSGS&ExBSGS 求解形如 \[a^x\equiv b\pmod p\] 的高次同余方程 BSGS 假装\(gcd(a,p)=1\). 设\(m=\lceil\sqrt p \rceil ...

  2. DRF项目之自定义分页器

    在项目中,我们多需要自定义分页器. 代码实现: class PageNum(PageNumberPagination): '''自定义分页器''' # 每页显示个数 page_size = 10 pa ...

  3. 7.5 Varnish VCL的变量和应用片段

  4. Codeforces 459E Roland and Rose

    本以为是个树形DP,按照树形DP的方法在那里dfs,结果WA到死,因为它存在有向环,不是树,凡是存在环的情况切记不要用树形的方法去做 题目的突破点在于将边排完序之后,用点表示以该点为边结尾的最大长度, ...

  5. 吴裕雄 Bootstrap 前端框架开发——Bootstrap 字体图标(Glyphicons):glyphicon glyphicon-download

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name ...

  6. 每天一点点之python - 基础语法

    1.字符串的拼接 'Hello, {0}, 成绩提升了 {1:.1f}%'.format('小明', 17.125) 输出结果如下: 可以通过和c语言一样,也可以通过format()来实现 2.简单运 ...

  7. Web系统测试的常用方法总结-18《转载》

    Web系统测试的常用方法归纳 --- 知识记录 1.页面链接检查 每一个链接是否都有对应的页面,并且页面之间切换正确.可以依靠一些工具,如:LinkBotPro.File-AIDCS.HTML Lin ...

  8. 072-PHP数组的交集和差集

    <?php $arr1=array(1,3,4,5,34,78,99); //参加第一项竞赛的学生学号数组 $arr2=array(5,6,7,3,56,34,8,9); //参加第二项竞赛的学 ...

  9. java如何连接Oracle数据库问题

    Oracle数据库纯属自学,不对请留言改正! 在学Oracle前相信已经大致知道mysql或sqlserver数据库,这个跟前面两个不大一样,你安装的时候让你输入一个密码,貌似是一个系统管理员密码,跟 ...

  10. Node.js NPM 介绍

    章节 Node.js NPM 介绍 Node.js NPM 作用 Node.js NPM 包(Package) Node.js NPM 管理包 Node.js NPM Package.json NPM ...