Worley Noise(一)

article/2025/7/8 16:44:36

一、Worley噪声原理

  (细胞噪声)Cell Noise,常用来模拟细胞类有孔纹理,是一种基于Voronoi图的噪声生成算法,1996年,在Siggraph96上,Steven Worley发表的论文《A Cellular Texture Basis Function》提出了一种用于实现cellular texture方法,能有有限的资源时间内快速生成Cell噪声,因此Cell噪声也常被称为Worley噪声。

这里写图片描述

  我们先来看看该算法基于的空间分割理论,在空间中,我们随机放置若干特征点(Feature points),对任一输入点P,计算其到所有特征点的距离,这个距离值的最小值就是最后的噪声值。如在上图中,蓝色点A为输入点,其他所有红色点为特征点,通过计算,特征点D距离A最近,所以最后的返回值为A到D的距离值(0.49)。根据上面的理论,理解上非常容易,我们也可以很快的想到实现的步骤和方法如下:
  1、在空间中随机产生若干特征点
  2、根据输入点位置遍历所有特征点,找到输入点到所有特征点的最小距离值返回
  这个算法是完全根据空间分割理论来实现的,因此逻辑上没有问题,但在真正实现时有遇到很多现实问题,一是所有空间存储特征点需要消耗巨大的存储空间,二是计算输入点到所有点的距离最小值会消耗巨大的时间,因此,上面的算法虽然逻辑可行,但实际操作不可行。

二、Worley噪声算法

  因此,Steven Worley在他的论文《A Cellular Texture Basis Function》中提出了一种优化算法,这种算法同时规避了上面说的两个弊端,不需要存储特征点,只计算输入点到若干相关特征点的距离值,真正将算法实用化。
Worley算法分六步:
  1、确定输入点所在的晶胞
  2、对该晶胞产生可重复的随机数生成器
  3、确定在该晶胞内生成特征点的数量
  4、随机的将3所生成的特征点放置到晶胞中
  5、计算输入点到该晶胞内所有特征点的距离最小值
  6、查找并计算输入点到所在晶胞直接相邻晶胞内特征点的距离最小值,并与5中生成的最小值比较,返回最小值

三、Worley噪声算法解释

  我们算法也根据Worley的方法分成六步,下面我将一一讲解
  1、确实输入点所在的晶胞

这里写图片描述

  这步与在Perlin噪声和Simplex噪声中一样,只需要对输入坐标进行GetFoor就可以得到左下角晶格点坐标值,也即是确定了输入点所在的晶胞
  2、对该晶胞产生可重复的随机数生成器
  为什么要生成可重复的随机数生成器,Worley算法基于沃罗诺伊图(Voronoi Diagram),或者说沃罗诺伊空间分割理论,按照沃罗诺伊的理论,空间中随机分布若干特征点,对Worley噪声算法来说,这些特征点是已经存在的,即需要保证在某个晶胞内的特征点分布是固定的,不能这次计算这个晶胞内三个特征点,下次计算是四个,所以在算法中我们需要一个能重复生成特征点的随机数发生器,换句话说就是不管什么时候计算,在特定晶胞内的特征点分布都是一样的,这对Worley噪声算法很重要。在我们的算法中我们使用晶胞左下角的顶点坐标值为种子生成随机数,这Hash函数就可以做到,在我们的算法里,我们使用了FNV Hash算法,这样可以保证种子的唯一性,然后我们使用之前学习的线性同余算法(LCG random number generator)作为我们随机数生成器。
  3、确定在该晶胞内生成特征点的数量
  理论上来讲,分布在晶胞内的特征点是由特征点在整个空间中的分布决定的。最简单的生成特征点的方法就是泊松分布(Poisson distribution),它指定空间中点的平均密度。每个点的位置独立于其他点,每个区域的点的任何数目的确切概率可用离散泊松分布函数来计算,即这些特征点随机分布在空间中且彼此之间相互独立,我们想要点的同向性分布,以避免明显的格子状的形式。出于性能的考虑,晶胞内的特征点不宜太多,我们取[1,9],最小值取1是为了防止下步计算出问题,原理下节说明。
  4、随机的将3所生成的特征点放置到晶胞中
  根据泊松分布理论,我们随机的将特征点放入到晶胞中去,实现操作中,我们并不存储特征点的坐标值,因为我们只需要输入点到特征点的距离值,在取到值后没必要保留特征点坐标。
  5、计算输入点到该晶胞内所有特征点的距离最小值
  在步骤4中,我们在放置特征点时就一并计算了距离值,放置完所有特征点也就可以得到输入点到该晶胞内所有特征点距离的最小值。
  6、查找并计算输入点到所在晶胞直接相邻晶胞内特征点的距离最小值,并与5中生成的最小值比较,返回最小值
  在5中,我们计算了输入点到其所在晶胞内的所有特征点的距离最小值,但有时,输入点到空间中所有特征点的距离最小值不一定就在该晶胞内,而可能在其相邻晶胞内,如下图所示。
这里写图片描述

  在上图中,输入点A到所有特征点的最小距离值是A与B的距离,显然此时A与B不在同一个晶胞内,所以我们还必须检查输入点到所有与其邻近晶胞内特征点的距离,这就需要对其相邻晶胞也进行迭代。
  现在我们来看看在步骤3中,我们为什么将特征点数量的下限设为1,因为下限设为1才能保证输入点到所有特征点的距离最小值的那个特征点要么处于与输入点相同的晶胞内要么处于与其直接相邻的晶胞内,如果下限不为1的话将出现与输入点距离最小值的那个特征点出现在别的地方,而且没法预估其出现的晶胞,这样会导致计算无法继续,如下图所示,与输入点A距离最小值的特征点为E,而E既不在与A相同的晶胞内,也不在与A直接相邻的晶胞内。
这里写图片描述

四、小结

  在前面的学习中,我们学习过几种常见的距离算法类型,如欧几里得距离(euclidean Distance),曼哈顿距离(Manhattan Distance),切比雪夫距离(Chebyshev Distance)等等,不同的距离算法最后生成的噪声会有明显的不同。同时,我们不仅可以得到输入点到特征点的最小值,也可以得到输入点到特征点的第二小值、第三小值等,利用这些值,可以实现很多不同的噪声效果。
  对任一位置x,定义F1(x)为x到其最近特征点的距离。当x变化时,F1平滑变化(因为x是平滑变化的)。但在特定端点,x可能会与2个特征点的距离相等。但这是没关系的。x连续变化时,F1值仍然连续,尽管F1的导数在计算距离从一特征点转到相邻特征点时会变化不连续。F2(x)表示x与第2近的特征点的距离。同样,可定义Fn(x)为x到第n近的特征点的距离。F函数有如下有趣的特征:
  1. Fn总是连续的;
  2. Fn是非减函数:0<=F1(x)<=F2(x)<=F3(x)…,通常Fn(x)<=Fn+1(x);
  3. Fn的梯度为从第n最近特征点到x的单位方向向量。

参考文献

1、A Cellular Texture Basis Function,Steven Worley,Siggraph96
2、An In Depth Cell Noise Tutorial


http://chatgpt.dhexx.cn/article/eiKYn8LZ.shtml

相关文章

mysql less6教程_【sqli-labs】Less5~Less6

双注入原理&#xff1a; 来源&#xff1a; 基本句式&#xff1a; select count(*), concat((select database()), floor(rand()*2))as a from information_schema.tables group by a; 派生表版 select 1 from (select count(*), concat(~,(select user()),~, floor(rand()*2))a…

【SLsec----wp】

目录 1&#xff0c;简单的隐写 2&#xff0c;海贼王里的宝藏 3&#xff0c;找你妹啊&#xff01; 4&#xff0c;简单的压缩包 5&#xff0c;四凯撒还四栅栏&#xff1f; 6&#xff0c; 动听音符 7&#xff0c; 小兔子 8&#xff0c;签到 9&#xff0c;1zMD5 10&#xff0c…

sqli-labs(less6)

一、sqli-labs(less6)GET - Double Injection - Double Quotes - String (双注入GET双引号字符型注入) 1.观察index.php中$sql 2&#xff0c;burp拦截 3.repeater一下 4&#xff0c;简单修改一下&#xff0c;用extractvalue函数 ?id100" union select 1,2,extractvalue…

WSCL

摘要 近些年来&#xff0c;因为弱监督目标检测仅需要图片分类级别的label受到了人们广泛的关注&#xff0c;其代价是准确率一定程度的下降。本文提出了一个简单而有效的弱监督协作目标检测框架&#xff0c;基于共享部分特征&#xff0c;增强预测相关性来同时训练强&#xff0c…

wsl介绍

wsl WSL安装打开wsl功能下载指令 配置信息WSL 介绍什么是WSL比较 WSL 版本WSL 的基本命令 问题解决 WSL安装 打开wsl功能 在windows功能里面勾选实用于linux的windows子系统下载 指令 可以使用单个命令安装运行 WSL 所需的一切内容。 在管理员模式下打开 PowerShell 或 Win…

Ubuntu20.04 Openssl安装

安装背景 因为ubuntu20.04LTS中自带的openssl1.1.1版本的函数库不天汇使用&#xff0c;在编译过程中无法找到编译路径&#xff0c;故此手动安装openssl&#xff08;我是个懒人&#xff0c;不到万不得已&#xff0c;不会手动安装&#xff0c;直接apt-get不香吗&#xff1f;&…

简易安装 OpenSSL

官网的太麻烦了 如果你装了git 他里面有一个openssl.exe 可以直接用 下面是简易安装方法 https://slproweb.com/products/Win32OpenSSL.html 我是win10 下这个 Win64 OpenSSL v3.1.1 选下面的 后面的赞助 全不选 配置环境变量 配置Path变量 命令行输入 openssl version 显…

python3.10.5安装时openssl安装失败的问题

初始问题&#xff1a;编译安装python后执行pip list 报错 [rootVM-0-6-centos Python-3.10.5]# pip3 list Package Version ---------- ------- pip 22.0.4 setuptools 58.1.0 WARNING: pip is configured with locations that require TLS/SSL, however the ssl mo…

LINUX安装openssl

openssl 官网下载 https://www.openssl.org/source/old/ 1、解压openssl包&#xff1a; tar -xzf openssl-1.1.1n.tar.gz2、得到openssl-1.1.1n目录&#xff0c;然后进入openssl-1.1.1n目录中&#xff0c;安装openssl到 /usr/local/openssl 目录&#xff0c;安装之后&#xff…

openssl安装教程(windows7系统,超详细)

openssl安装教程 1.安装包安装1.1所需资源链接1.2安装流程1.3测试是否安装成功1.4安装过程中的问题 2.自己编译源码再安装 1.安装包安装 1.1所需资源链接 openssl安装包下载地址&#xff1a;http://slproweb.com/products/Win32OpenSSL.html 如果用谷歌浏览器打开的话&#x…

在Window 10 64位电脑上安装 OpenSSL安装过程

前期准备 安装最新版的ActivePerl到https://www.openssl.org 下载最新OpenSSL源码到http://www.nasm.us 下载NASM汇编工具在开始任务栏里打开vc2010的工具文件夹&#xff0c;如图所示&#xff1a; 选择Visual Studio命令提示&#xff08;如果是编译64位的openssl,应该打开的…

windows下OpenSSL安装

官网下载地址&#xff1a;https://www.openssl.org/source/ 项目GitHub地址&#xff1a; https://github.com/openssl/openssl 其他下载地址&#xff1a;http://slproweb.com/products/Win32OpenSSL.html https://oomake.com/download/openssl 一、下载openssl安装版 二、修…

OpenSSL安装及查看版本号

1、安装OpenSSL 下载链接 安装按照提示即可 2、添加系统path环境变量 D:\OpenSSL-Win64\OpenSSL-Win64\bin3、查看OpenSSL版本号 openssl version 或者 openssl version -a

openssl安装方式(Ubuntu下)

openssl安装方式 官方网站1、解压2、编译安装3、生成 软连接4、测试 官方网站 https://www.openssl.org/source/ 1、解压 我这里 安装的版本时1.0.2&#xff0c;其实都一样 &#xff0c;默认版本 是1.1.1 拿到 源码后先解压源码文件 openssl-1.0.2u.tar.gz2、编译安装 进…

Linux查找openssl文件夹,Linux下OpenSSL 安装详解 +图解

安装环境&#xff1a; 操作系统&#xff1a;redhat 12.0 OpenSSL Version:openssl-0.9.8l Download 安装包(Linux source) :openssl-0.9.8l.tar.gz(or the latest version of openssl)下载地址&#xff1a; 在linux下解压缩下载到的安装包&#xff0c;命令如下.....tar -xzf op…

OpenSSL安装升级

官网&#xff1a;/source/index.html 当前(2020-10-22)最新稳定版本&#xff1a;https://www.openssl.org/source/openssl-1.1.1h.tar.gz Note: The latest stable version is the 1.1.1 series. This is also our Long Term Support (LTS) version, supported until 11th Se…

【物联网】Linux平台OpenSSL安装教程

00. 目录 文章目录 00. 目录01. OpenSSL概述02. OpenSSL下载03. OpenSSL安装04. 查看系统OpenSSL版本05. 附录 01. OpenSSL概述 OpenSSL是一个安全套接字层密码库&#xff0c;囊括主要的密码算法、常用密钥、证书封装管理功能及实现ssl协议。OpenSSL整个软件包大概可以分成三个…

OpenSSL安装使用(二):OpenSSL安装说明

注&#xff1a;该方法适用于Openssl 1.1.1及以上版本 1&#xff09;安装环境&#xff1a;Windows10专业版VS2010 相关软件下载地址&#xff1a; 1&#xff09;ActivePerl &#xff1a;Download & Install Perl - ActiveState 2&#xff09;openssl&#xff1a;/source/…

OpenSSL安装

下载OpenSSL压缩包 下载地址 可以直接下载压缩包或者用Git拉取 下载perl 下载地址 下载压缩包&#xff0c;解压&#xff0c;将路径D:\Program\strawberry-perl\perl\bin配置到环境变量path中 打开powershell&#xff0c;输入perl -v 代表安装成功 下载nasm 下载地址 下载…

OpenSSL完整安装教程及部分问题解决

一、环境&#xff1a; 系统&#xff1a;Centos 7 OpenSSL版本&#xff1a;openssl-1.1.1g 二、下载 OpenSSL官方下载网址&#xff1a;https://www.openssl.org/source/ openssl有发行了2.0版本&#xff0c;但此处仅用稳定的1.0版本即可。 官方教程&#xff1a;https://wiki.…