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. pytorch max和clamp

    torch.max() torch.max(a):数组a的最大值 torch.max(a, dim=1):多维数组沿维度1方向上的最大值,若a为二维数组,则为每行的最大值(此时是对每行的每列值比较取最 ...

  2. 编程题目:求幂 (python)

    数值的整数次方 效率0(lgn) 这个求幂函数无论 基数 或 次方 为 正数或者为负数都是成立的.只是他们都为整数罢了. 注意了哦,这个代码必须要用python3才能运行正确,因为python3的 整 ...

  3. 004.CI4框架CodeIgniter, 配置mysql数据库,并进行数据库查询

    01.在app的Config目录的Database文件里面填写数据库配置,并把pConnect设置成true,此处为一直连接mysql数据库 02.在Models中,创建一个System目录,再在Sy ...

  4. Win 10 开启FTP与配置

    转载:https://blog.csdn.net/qq_34610293/article/details/79210539 可能出现的问题是:设置共享文件,无法被共享.极大的可能原因是电脑防火墙的问题 ...

  5. Spring AOP 管理事务

    <aop:config proxy-target-class="true"> <aop:pointcut expression="execution(* ...

  6. django 中从外界借助多个网站时 static 的存放和整理

    在 模板之家中  前端页面直接上去抓取  可是遇到重复  或者 版本不统一  所以 在每个app下面建立自己的 stastic 在制作的html  页面上方 导入静态页面 {% load static ...

  7. 7. 单机版Redis的安装以及Redis生产环境启动方案

    安装单机版redis redis的生产环境启动方案redis cli的使用 1. 安装单机版redis 大家可以自己去官网下载,当然也可以用课程提供的压缩包 wget http://downloads ...

  8. JAVA - SpringBoot项目跨域访问

    JAVA - SpringBoot添加支持CORS跨域访问 CORS(Cross-Origin Resource Sharing)“跨域资源共享”,是一个W3C标准,它允许浏览器向跨域服务器发送Aja ...

  9. [题解] LuoguP6075 [JSOI2015]子集选取

    传送门 ps: 下面\(n\)和\(k\)好像和题目里的写反了...将就着看吧\(qwq\) 暴力打个表答案就出来了? 先写个结论,答案就是\(2^{nk}\). 为啥呢? 首先你需要知道,因为一个集 ...

  10. 十四、 React路由(react-router4.x): 动态路由、get传值、React中使用url模块

    概述 新闻列表 -跳转-> 详情页 时,想把列表对应的id传到详情页里,可用到三种传值方法: 1.动态路由传值 2.get传值 3.localstorage传值 一.动态路由传值 [App.js ...