chan-vese模型
Python--level set (水平集)和 chan-vese模型
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模型)代码:
- import cv2
- from pylab import*
- Image = cv2.imread('02.jpg', 1) # 读入原图
- image = cv2.cvtColor(Image, cv2.COLOR_BGR2GRAY)
- img = np.array(image, dtype=np.float64) # 读入到np的array中,并转化浮点类型
- # 初始水平集函数
- IniLSF = np.ones((img.shape[0], img.shape[1]), img.dtype)
- IniLSF[300:320, 300:320] = -1
- IniLSF = -IniLSF
- # 画初始轮廓
- Image = cv2.cvtColor(Image, cv2.COLOR_BGR2RGB)
- plt.figure(1), plt.imshow(Image), plt.xticks([]), plt.yticks([]) # to hide tick values on X and Y axis
- plt.contour(IniLSF, [0], color='b', linewidth=2) # 画LSF=0处的等高线
- plt.draw(), plt.show(block=False)
- def mat_math(intput, str):
- output = intput
- for i in range(img.shape[0]):
- for j in range(img.shape[1]):
- if str == "atan":
- output[i, j] = math.atan(intput[i, j])
- if str == "sqrt":
- output[i, j] = math.sqrt(intput[i, j])
- return output
- # CV函数
- def CV(LSF, img, mu, nu, epison, step):
- Drc = (epison / math.pi) / (epison*epison + LSF*LSF)
- Hea = 0.5*(1 + (2 / math.pi)*mat_math(LSF/epison, "atan"))
- Iy, Ix = np.gradient(LSF)
- s = mat_math(Ix*Ix+Iy*Iy, "sqrt")
- Nx = Ix / (s+0.000001)
- Ny = Iy / (s+0.000001)
- Mxx, Nxx = np.gradient(Nx)
- Nyy, Myy = np.gradient(Ny)
- cur = Nxx + Nyy
- Length = nu*Drc*cur
- Lap = cv2.Laplacian(LSF, -1)
- Penalty = mu*(Lap - cur)
- s1 = Hea*img
- s2 = (1-Hea)*img
- s3 = 1-Hea
- C1 = s1.sum() / Hea.sum()
- C2 = s2.sum() / s3.sum()
- CVterm = Drc*(-1 * (img - C1)*(img - C1) + 1 * (img - C2)*(img - C2))
- LSF = LSF + step*(Length + Penalty + CVterm)
- # plt.imshow(s, cmap ='gray'),plt.show()
- return LSF
- # 模型参数
- mu = 1
- nu = 0.003 * 255 * 255
- num = 20
- epison = 1
- step = 0.1
- LSF = IniLSF
- for i in range(1, num):
- LSF = CV(LSF, img, mu, nu, epison, step) # 迭代
- if i % 1 == 0: # 显示分割轮廓
- plt.imshow(Image), plt.xticks([]), plt.yticks([])
- plt.contour(LSF, [0], colors='r', linewidth=2)
- 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模型的更多相关文章
- Vuforia开发完全指南---不懂编程也能做AR程序
不懂编程也能做AR程序 可能一听到要做AR程序,很多人都会想到这是程序员的事.如果不懂编程,不会写代码,是做不了AR程序的.其实,Vuforia的Unity SDK非常人性化,即使你不会编程,也能做出 ...
- Active Snake (Level Set 模型)
前沿:最近由于大论文实验的原因,需要整理几种Snake方法,以比较道路提取效果.所以今天晚上就将电脑中的一些LBF Snake代码作一下分类定义.并给出效果.以便比较. 1. 原始的LBF Snake ...
- NS2仿真:公交车移动周期模型及性能分析
NS2仿真实验报告3 实验名称:公交车移动周期模型及性能分析 实验日期:2015年3月16日~2015年3月21日 实验报告日期:2015年3月22日 一.实验环境(网络平台,操作系统,网络拓扑图) ...
- 【Unity Shader】Unity Chan的卡通材质
写在前面 时隔两个月我终于来更新博客了,之前一直在学东西,做一些项目,感觉没什么可以分享的就一直没写.本来之前打算写云彩渲染或是Compute Shader的,觉得时间比较长所以打算先写个简单的. 今 ...
- (转)Go语言并发模型:使用 context
转载自:https://segmentfault.com/a/1190000006744213 context golang 简介 在 Go http包的Server中,每一个请求在都有一个对应的 g ...
- go 语言之 生产者消费模型
简易的生产者消费模型,通过管道[也可以理解为队列],管道是先进先出,主要是理解chan 生产者使用make将chan初始化,并且设置chan长度,如果不设置,生产者就写入不了通道 go 是使用线程开始 ...
- Unity Chan 3D Asset
Unity Chan 3D Asset 我真的很久沒再家裡開unity,不過今天让我久违的開了 下载地址 :http://ref.gamer.com.tw/redir.php?url=http%3A ...
- golang学习笔记 ---面向并发的内存模型
Go语言是基于消息并发模型的集大成者,它将基于CSP模型的并发编程内置到了语言中,通过一个go关键字就可以轻易地启动一个Goroutine,与Erlang不同的是Go语言的Goroutine之间是共享 ...
- 11 The Go Memory Model go语言内置模型
The Go Memory Model go语言内置模型 Version of May 31, 2014 Introduction 介绍 Advice 建议 Happens Before 在发生之前 ...
随机推荐
- python 关于异常处理 try...except... 的两个案例
输入若干个成绩,求所有成绩的平均分.每输入一个成绩后询问是否继续输入下一个成绩,回答“yes”就继续输入下一个成绩,回答“no”就停止输入成绩. numbers = [] #使用列表存放临时数据 wh ...
- Koa微信公众号开发
微信开发者模式开启需要服务器域名合法并且把接口配置好,这个接口是接通的关键,接通后微信后台的菜单设置功能,客服功能会失效,需要开发者自定义菜单和智能客服界面,并且接通后可以调用微信网页内部的定位分享等 ...
- Element-UI Table 实现筛选数据功能
最近产品提出了一个筛选数据的功能,要求在表头里实现一个下拉框进行筛选. 首先, Element-ui 的官方文档,el-table-column 下有一个 filters , 用于数据的筛选和过滤, ...
- pyhton pandas数据分析基础入门(一文看懂pandas)
//2019.07.17 pyhton中pandas数据分析基础入门(一文看懂pandas), 教你迅速入门pandas数据分析模块(后面附有入门完整代码,可以直接拷贝运行,含有详细的代码注释,可以轻 ...
- Java按位运算符之按位取反
一 数据储存形式 二进制在内存中以补码的形式存在. 补码首位是符号位,0表示该数是正数,1表示该数是负数. 例如: 数值 带符号的二进制原码 (首位表示符号位) 补码 内存中的形式 (*表示无 ...
- UVA - 1346 Songs (贪心+排序)
题意:已知每首歌的标号,长度和播放频率,求一种播放顺序,使得最小,并且输出该播放顺序下第t首歌的标号. 分析: 1.长度越短,播放频率越大的歌排在前面,上式越小. 2.s(i)表示的是当前播放顺序下这 ...
- request.getParameter() 接收参数中文乱码
修改tomcat配置文件 设置url编码集 <Connector port="8080" protocol="HTTP/1.1" connectionTi ...
- 操作系统类型&操作系统结构&现代操作系统基本特征
五大类型操作系统 (1). 批处理操作系统 用户脱机使用计算机 用户提交作业之后直到获得结果之前就不再和计算机打交道. 作业提交的方式可以是直接交给计算中心的管理操作员,也可以是通过远程通讯线路提交. ...
- oracle 使用触发器实现id自增
前提:存在数据库di_test,主键为id.1.创建一个索引sequence create sequence di_test_id minvalue 1 nomaxvalue start with 1 ...
- 两表关联更新数据——oracle
from testb b where b.id=a.id) ; (where exists(select 1 from testb b where b.id=a.id):如果没有这个条件,不匹配的选项 ...