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. python 关于异常处理 try...except... 的两个案例

    输入若干个成绩,求所有成绩的平均分.每输入一个成绩后询问是否继续输入下一个成绩,回答“yes”就继续输入下一个成绩,回答“no”就停止输入成绩. numbers = [] #使用列表存放临时数据 wh ...

  2. Koa微信公众号开发

    微信开发者模式开启需要服务器域名合法并且把接口配置好,这个接口是接通的关键,接通后微信后台的菜单设置功能,客服功能会失效,需要开发者自定义菜单和智能客服界面,并且接通后可以调用微信网页内部的定位分享等 ...

  3. Element-UI Table 实现筛选数据功能

    最近产品提出了一个筛选数据的功能,要求在表头里实现一个下拉框进行筛选. 首先, Element-ui 的官方文档,el-table-column 下有一个 filters , 用于数据的筛选和过滤, ...

  4. pyhton pandas数据分析基础入门(一文看懂pandas)

    //2019.07.17 pyhton中pandas数据分析基础入门(一文看懂pandas), 教你迅速入门pandas数据分析模块(后面附有入门完整代码,可以直接拷贝运行,含有详细的代码注释,可以轻 ...

  5. Java按位运算符之按位取反

    一 数据储存形式 二进制在内存中以补码的形式存在. 补码首位是符号位,0表示该数是正数,1表示该数是负数.   例如:   数值 带符号的二进制原码 (首位表示符号位) 补码 内存中的形式 (*表示无 ...

  6. UVA - 1346 Songs (贪心+排序)

    题意:已知每首歌的标号,长度和播放频率,求一种播放顺序,使得最小,并且输出该播放顺序下第t首歌的标号. 分析: 1.长度越短,播放频率越大的歌排在前面,上式越小. 2.s(i)表示的是当前播放顺序下这 ...

  7. request.getParameter() 接收参数中文乱码

    修改tomcat配置文件 设置url编码集 <Connector port="8080" protocol="HTTP/1.1" connectionTi ...

  8. 操作系统类型&操作系统结构&现代操作系统基本特征

    五大类型操作系统 (1). 批处理操作系统 用户脱机使用计算机 用户提交作业之后直到获得结果之前就不再和计算机打交道. 作业提交的方式可以是直接交给计算中心的管理操作员,也可以是通过远程通讯线路提交. ...

  9. oracle 使用触发器实现id自增

    前提:存在数据库di_test,主键为id.1.创建一个索引sequence create sequence di_test_id minvalue 1 nomaxvalue start with 1 ...

  10. 两表关联更新数据——oracle

    from testb b where b.id=a.id) ; (where exists(select 1 from testb b where b.id=a.id):如果没有这个条件,不匹配的选项 ...