LIC(Line Integral Convolution)
前言
最近在阅读NPR相关论文时需要用到线积分卷积,因此查阅了一下相关论文以及网上已有的实现方法。本文主要讲解线积分卷积的快速实现版本(SIGGRAPH,1995)。为了便于实验和测试,用Python实现并进行了简单的封装。如果本文讲解部分有任何理解错误,希望明确指出。
线积分卷积原理
首先,我们需要获取一张图像的二维矢量场,基于每个像素点上矢量的方向来构造一条流线。构造流线的方式在最早的论文中使用了DDA算法。通过以下的公式来进行迭代:
P0=(x+0.5,y+0.5)P_0 = (x+0.5,y+0.5) P0=(x+0.5,y+0.5)
Pi=Pi−1+V(Pi−1)∣V(Pi−1)∣∗△si−1P_i = P_{i-1} + \frac{V(P_{i-1})}{|V(P_{i-1})|}*\bigtriangleup{s_{i-1}} Pi=Pi−1+∣V(Pi−1)∣V(Pi−1)∗△si−1
此处V(Pi−1)V(P_{i-1})V(Pi−1)代表的是矢量场Pi−1P_{i-1}Pi−1坐标下的数值。
△si−1\bigtriangleup{s_{i-1}}△si−1的含义是在Pi−1P_{i-1}Pi−1点处上下左右四个方向中变化量最小的方向的数值,计算的方式也很简单,请参考论文1。
另外需要注意的是此处需要计算出一条流线,但是初始的点只有一个,所以要考虑到向前查找和向后查找,即:
Pi=Pi−1−V(Pi−1)∣V(Pi−1)∣∗△si−1P_i = P_{i-1} - \frac{V(P_{i-1})}{|V(P_{i-1})|}*\bigtriangleup{s_{i-1}} Pi=Pi−1−∣V(Pi−1)∣V(Pi−1)∗△si−1
这样逐步查找构造一条流线的方式本质上就是递归来寻找下一个点,结束条件依靠△si−1\bigtriangleup{s_{i-1}}△si−1数值设定一个阈值来控制。
最后,通过刚才构筑好的多条流线通过卷积运算的方式就可以计算出每一个像素点的数值。此处计算方式不是很难,参考第一篇论文就可以进行计算。
时间原因,以后再补充关于快速运算的算法。TODO
不足
参考文献1的问题就在于运算速度过慢,因而可以通过第二篇的快速算法来进行一定的加速处理2。
当然这两篇的实现都是在CPU上进行的,可以通过并行处理的方式进行一定加速。
后续我会补充GPU上的实现算法。
实验结果
输入图片
输出图片
参考资料
- http://www.cs.utah.edu/~wmartin/cs523project/
- https://github.com/philogb/LIC
- https://github.com/tatsy/lime
---------------------------------------------20181019更新----------------------------------
附上WebGL版的demo
Cabral, Brian, and Leith Casey Leedom. "Imaging vector fields using line integral convolution." Proceedings of the 20th annual conference on Computer graphics and interactive techniques. ACM, 1993. ↩︎
Stalling, Detlev, and Hans-Christian Hege. "Fast and resolution independent line integral convolution." Proceedings of the 22nd annual conference on Computer graphics and interactive techniques. ACM, 1995. ↩︎
LIC(Line Integral Convolution)相关推荐
- 曲线积分(Line Integral)
1.曲线积分 1.1 曲线积分的意义 曲线积分可用于求物体沿路径运动时所做的功,以及求密度变化的导线的质量 曲线积分不再是以往在某个区间内进行积分,而是在特定曲线上进行积分,即积分区域变为了一条曲线 ...
- 白噪声 java_白噪声 高斯白噪声
使用2D矢量场的 LIC(line integral convolution) 算法时,需要使用 白噪声图片 作为输入.查阅了相关资料.整理如下: 1. 白噪声的定义 白光是所有颜色的光的叠加而成,不 ...
- 基于LIC算法的二维矢量场可视化
线积分卷积算法(Line Integral Convolution,LIC法)是一种经典的矢量场可视化方法,由Cabral和Leedom 在1993年的SIGGRAPH大会上提出,该算法可以有效地表征 ...
- CAx软件开发技术专题:后处理可视化常用算法
后处理可视化是CAx软件的重要组成模块.开源代码VTK以其跨平台.丰富的数据结构与算法.可扩展性.易用性等特点而逐渐成为了CAx软件后处理首选的技术方案. 虽然VTK提供了相对完备的后处理功能,但要用 ...
- Contour Integral
Many integrals can be solved with the help of a number of techniques. substituion integration by par ...
- 【ECCV2020】完整论文集part2
ECCV2020将于2020年8月23-28日在线上举行,今年共接受了1361篇论文,本文是接收论列表的第二部分,第一部见链接 Paper ID Paper Title Category 2515 T ...
- 常用数学符号英文名字
转 http://www.rapidtables.com/math/symbols/Basic_Math_Symbols.htm Basic math symbols Symbol Symbol Na ...
- 论文研读 —— 1. Modeling Motion Blur in Computer Generated Images
文章目录 Authors and Publishment Categories 0. Abstract 1. Introduction 2. Image Formation Model 3. Effe ...
- [转载]常用数学专业名词的英语
目录 前言 数学分支的英文: 命题的英文: 数学中常见数词的英语: 点的英文: 线的英文: 面的英文: 角的英文: 距离的英文: 多边形的英文: 三角形的英文: 四边形的英文: 圆的英文: 多面体的英 ...
最新文章
- 在Windows上搭建Git Server
- /GS 编译选项,_security_cookie,软件强制DEP
- python中的__new__概念(工厂
- Linux qt程序打包依赖库,Linux打包免安装的Qt程序(编写导出依赖包的脚本copylib.sh,程序启动脚本MyApp.sh)...
- cmd中安装app的的命令
- 面试中的 10 大排序算法总结
- Httpclient gzip 乱码问题解决
- 数值线性代数徐树方pdf_MIT线性代数4-8:矩阵分解,向量空间,列空间和零空间,线性方程组求解...
- windows中VMWare下安装Mac Os X 10.11踩坑记
- 如何下载3GPP协议
- matlab2012簡明教程課後習題答案,MATLAB习题答案
- 网络小知识笔记——交换机、路由器、网关和路由
- 1w存银行一年多少利息_100万存银行1年能有多少钱利息?
- 前端vue-高德地图操作
- PowerMockito 简介
- windows执行bat文件闪退情况解决
- JsonObject生成Json字符串有转意字符
- Ubuntu20.04桌面系统快速上手教程
- 和菜头-和腾讯新闻哥谈谈腾讯价值观
- IDM trust Keycloak