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. Prometheus Operator【转】

    前面我们介绍了 Kubernetes 的两种监控方案 Weave Scope 和 Heapster,它们主要的监控对象是 Node 和 Pod.这些数据对 Kubernetes 运维人员是必须的,但还 ...

  2. RocketMQ 单机部署(单master模式)

    一.为了快速了解rockmq,先搭建一个简单的单机版的rocketmq,前期准备:1.CentOS 7.6 64位(阿里云)(4G内存) 2.jdk1.8 3.maven 3.5.4 4.直接从官网上 ...

  3. Java提升二:Lambda表达式与方法引用

    1.Lambda表达式 1.1.定义 lambda表达式是对于函数式接口(只含有一个抽象方法的接口)的简洁实现方式.它与匿名内部类的作用相似,但是就使用范围而言,匿名内部类更为广泛,而lambda表达 ...

  4. 八、Delphi10.3读取JSON文件,并修改JSON数组一条内容后保存到文件

    一.我们有一个JSON文件,如下: { "在野": [ { "城池": 0, "武将": 74, "登场年": 190 ...

  5. uniapp 小程序 flex布局 v-for 4栏展示

    注:本项目的图片资源来源于后端接口,所以使用的是v-for. 关键词:uniapp 小程序 flex布局 v-for 4栏展示 自适应 <view style="display: fl ...

  6. F. Fairness 分硬币最大差值最小

    F. Fairness time limit per test 2.0 s memory limit per test 64 MB input standard input output standa ...

  7. C++ AVFrame转BMP 或者其他形式转化也可

    void CffmpegUIDlg::SaveAsBMP(AVFrame *pFrameRGB, int width, int height, int index, int bpp) { BITMAP ...

  8. 工具类css框架

    @charset "UTF-8"; * {     -webkit-box-sizing: border-box;     box-sizing: border-box;      ...

  9. 7 —— node —— 响应图片

      const http = require('http'); const fs = require('fs'); const server = http.createServer(); server ...

  10. 指令——touch

    一个完整的指令的标准格式: Linux通用的格式——#指令主体(空格) [选项](空格) [操作对象] 一个指令可以包含多个选项,操作对象也可以是多个. 指令:touch    作用:创建文件 语法: ...