Python的3D可视化库【vedo】1-4 (visual模块) 体素可视化、光照控制、Actor2D对象
文章目录
- 6. VolumeVisual
- 6.1 关于体素
- 6.2 显示效果
- 6.2.1 遮蔽
- 6.2.2 木纹或磨砂效果
- 6.3 颜色和透明度
- 6.3.1 透明度衰减单位
- 6.3.2 划分透明度标量梯度
- 6.3.3 设置颜色或渐变
- 6.3.4 标量的计算模式
- 6.3.5 标量的插值方式
- 6.4 过滤
- 6.4.1 按单元格id隐藏单元格
- 6.4.2 按二进制矩阵设置隐藏
- 7 Actor2D
- 7.1 可用的方法
- 7.2 被子类重写的方法
- 7.3 存在错误的方法
- 8. LightKit
- 8.1 关于灯光
- 8.2 在显示时设置灯光
vedo是Python实现的一个用于辅助科学研究的3D可视化库。
vedo的visual
子模块包含了管理对象及其属性的可视化和外观的基类。
其中VolumeVisual
包含了体素对象Volume
的可视化控制方法;
Actor2D
是对vtkActor2D
的封装,用于管理2D对象;
LightKit
是一组光工具套件,用于控制3D场景中的光照效果。
参考:vedo官方文档
6. VolumeVisual
体素对象的可视化控制。
6.1 关于体素
像素是2D空间中不可分割的最小单位,而体素是像素在3D空间的扩展。体素不仅包含模型的表面信息,还包含模型的内部属性。
体素是量化为固定大小的可视化点云。点云可以在空间中任何位置有无数的点和浮点坐标,而体素具有固定的大小和整数坐标。
体素是规格化的,存储和解析都很方便。它不需要浮点运算,可以避免CPU浮点运算的瓶颈。
立体数据是3D空间中对物体的离散采样。3D笛卡尔标量表示立体数据的格式一般为(x, y, z, feature)
,其中feature
代表某个点的灰度或其它信息。
立体数据表示的是每个点的属性,无法可视化。为了使立体数据可视化,就以采样点为中心,把feature
表示特征扩充到一个小立方体上,这个小立方体就表示体素。
创建体素对象:
# 创建10x10x10的矩阵
data_matrix = np.zeros([10, 10, 10], dtype=np.uint8)
# 从该矩阵创建体素对象
v = vedo.Volume(data_matrix)
# 体素对象的标量范围是[0. 0.]
print(v.scalar_range())
# 展示
vedo.show(v, axes=1)
后续使用的示例体素对象都用numpy的矩阵构建:
# 创建10x10x10的矩阵
data_matrix = np.zeros([10, 10, 10], dtype=np.uint8)
# 矩阵的值沿x坐标从0到9变化
for i in range(10):data_matrix[i:i+1, :, :] = i
v = vedo.Volume(data_matrix)
# 体素对象的标量范围是[0. 9.]
print(v.scalar_range())
6.2 显示效果
6.2.1 遮蔽
v.shade(status=None)
设置或获取体素对象的遮蔽状态,0为关闭,1为开启。默认是开启状态开启后图像显示的颜色会受背后体素的叠加。
遮蔽效果可以被volume.lighting()
方法进一步控制。
启用遮蔽时,映射器会进行遮蔽计算。
有些情况下遮蔽不会应用。如在mode
为1或2时。
# 从该矩阵创建体素对象
v1 = vedo.Volume(data_matrix).shade(0)
v2 = vedo.Volume(data_matrix).shade(1)
vedo.show([("shade=0", v1),("shade=0", v2),], axes=1, shape=(1, 2), size=(800, 400))
shade关闭和打开的效果。后面的一些示例为易于观察,显示时会关闭shade效果。
6.2.2 木纹或磨砂效果
v.jittering(status=None)
为真时,每个光线的途径方向都会用噪音纹理轻微干扰,以消除木纹效果。
# 消除木纹效果
v1 = vedo.Volume(data_matrix).jittering(True)
v2 = vedo.Volume(data_matrix).jittering(False)
vedo.show([(vedo.Text2D("jittering", s=2), v1),(vedo.Text2D("default", s=2), v2)], axes=1, shape=(1,2), size=(800, 400))
使用鼠标拖动时出现的木纹效果变为磨砂效果:
6.3 颜色和透明度
6.3.1 透明度衰减单位
v.alpha_unit(u=None)
定义每单位长度的光衰减量。默认值是1。
设置为0时,光不衰减,物体的任何位置都是完全不透明的。该值越大,渲染越趋于透明。
# 从该矩阵创建体素对象
v1 = vedo.Volume(data_matrix).cmap("r").alpha_unit(0)
v2 = vedo.Volume(data_matrix).cmap("r").alpha_unit(1)
v3 = vedo.Volume(data_matrix).cmap("r").alpha_unit(5)
vedo.show([("alpha_unit=0", v1),("alpha_unit=1", v2),("alpha_unit=5", v3),], axes=1, shape=(1, 3), size=(1200, 400))
6.3.2 划分透明度标量梯度
v.alpha_gradient(alpha_grad, vmin=None, vmax=None)
为沿着标量范围的体素梯度分配一系列的透明度。可以给单个常量值。
这个梯度函数用来减少体素的平坦区域的不透明性,不同类型的材料之间的界限的不透明性维持不变。
梯度是依据光强在单位距离上的变化量决定的。
alpha_grad
的格式和传给函数volume.alpha()
的格式一样。
填透明度序列时,如[0, 0.2, 1]
,表示标量范围前半段的透明度从0到0.2变化,后半段从0.2到1变化。
填单个值时,表示设置统一的透明度。
也可以填二维的序列,如[(0, 0), (7, 0.2), (9, 1)]
,表示标量值从0到7,透明度从0变到0.2,标量值从7到9,透明度从0.2变化到1。
沿用上面的体素对象,查看不同的alpha_grad
值的效果:
6.3.3 设置颜色或渐变
v.cmap(c, alpha=None, vmin=None, vmax=None)
和CommonVisual.color()
效果一样。
c可以填单个颜色或颜色映射。单个颜色必须使用colors.colors
中给定的英文颜色名称或colors.color_nicks
给出的颜色缩写。
使用不同的c值的效果:
6.3.4 标量的计算模式
v.mode(mode=None)
指定体素的渲染模式。可选的值如下:
基类
CommonVisual
的alpha
方法可以通过输入二维序列来定义标量到实际透明度的转换方式。如alpha=[(-5, 0), (35, 0.4) (123,0.9)]
,表示标量值在-5以下的都是透明的,标量值在35时,透明度为40%,标量值大于123时,透明度为90%。
0,composite
。默认模式,标量值从体素中采样,并在渲染透明度时以从前到后的模式复合。取样的标量值经过alpha提供的转换方式,转为最终的颜色和透明度。
1,maximum projection
。使用最大标量值渲染。该值会经过转换,成为颜色与透明度。
2,minimum projection
。使用最小标量值。该值需要转换为颜色与透明度值。
3,average projection
。标量值和透明度转换后的值相乘,然后累加,得到的结果再除以体素对象的样本数。结果图一般是灰度图。由于累加的值是计算值而不是取样方向上的真值,因此不会做转换。
4,additive mode
。标量值和透明度转换的值相乘,然后累加。即标量值用给定的透明度来缩放,又相加来产生结果颜色。结果图一般是灰度图。
6.3.5 标量的插值方式
v.interpolation(itype)
设置标量的插值类型。0是最近邻插值,1是线性插值。
# 对上面的体素对象,使用不同的插值策略
v1 = vedo.Volume(data_matrix).shade(0).interpolation(0)
v2 = vedo.Volume(data_matrix).shade(0).interpolation(1)
vedo.show([("nearest neighbour", v1),("linear", v2),], axes=1, shape=(1, 2), size=(800, 400))
6.4 过滤
6.4.1 按单元格id隐藏单元格
v.hide_voxels(ids)
在可视化中隐藏体素单元格。填体素的单元格id列表。
data_matrix = np.zeros([100, 100, 100], dtype=np.uint8)
v1 = vedo.Volume(data_matrix).shade(0)
# 隐藏一半单元格
v1.hide_voxels(range(v1.ncells // 2))
v1.show()
6.4.2 按二进制矩阵设置隐藏
v.mask(data)
使用二进制值屏蔽体素的可视化。需指定volume.mapper = "gpu"
。
from vedo import np, Volume, show
data_matrix = np.zeros([75, 75, 75], dtype=np.uint8)
# 设置值
data_matrix[ 0:35, 0:35, 0:35] = 1
data_matrix[35:55, 35:55, 35:55] = 2
data_matrix[55:74, 55:74, 55:74] = 3
vol = Volume(data_matrix).cmap('Blues')
vol.mapper = "gpu"
# 创建二进制矩阵,要显示的部分标记为1
data_mask = np.zeros_like(data_matrix)
data_mask[10:65, 10:60, 20:70] = 1
vol.mask(data_mask)
show(vol, axes=1).close()
这个方法使用后,一直显示失败,未找到调整方法。
7 Actor2D
管理2D对象。是对vtkActor2D
的封装。
Actor2D
封装的方法有的存在BUG,有的在子类中被重写。
7.1 可用的方法
t.mapper
获取内部的vtkMapper
对象。
t.on()
使对象可见
t.off()
使对象不可见
t.toogle()
切换对象可见性
t.pickable(value=True)
设置对象的可选取性。
t.add_observer(event_name, func, priority=0)
为事件绑定回调函数。
t.layer(value=None)
设置或获取在多个渲染层中的图层编号。
t.coordiante_system(value=None)
设置或获取对象的坐标所在的坐标系。
value可选整型数值0到6:
0,Display。x、y取值为渲染窗口的像素值,坐标原点在窗口的左下角。
1,Normalized Display。和Display一样基于渲染窗口,不过x、y的取值范围为[0,1]
。
2,Viewport。x、y的坐标值定义在视口或渲染器里。
3,Normalized Viewport。默认值。x、y的坐标值定义在视口或渲染器里,取值范围[0,1]
。
4,View。x、y、z坐标值定义在相机所在的坐标系统里,取值范围[-1,1]
,Z表示深度信息。
5,Pose。
6,World。x、y、z坐标值定义在世界坐标系统。世界坐标系是放置Actor的三维空间坐标系。
7.2 被子类重写的方法
t.pos(px=None, py=None)
设置或获取在屏幕坐标中的位置。
仅有的子类Text2D
对这个方法做了重写。
t.color(value=None)
c.c(value=None)
设置或获取对象颜色。
Text2D
只能设置,不能获取颜色。
t.alpha(value=None)
设置或获取对象透明度。
Text2D
只能设置,不能获取透明度。
7.3 存在错误的方法
t.ps(point_size=None)
设置构成对象的点的大小。
t.lw(line_width=None)
设置构成对象的线条的宽度。
t.ontop(value=True)
置顶或置底对象。
8. LightKit
光工具套件,包括3种光源,主光灯、补光灯、头灯。
8.1 关于灯光
主光灯一般是出现在头顶的光源(类似太阳、吊灯等)。它通常和垂直方向成45度夹角,会略微的左右偏移,向下照射。主光的亮度一般至少是其它光总亮度的两倍,以进行更好的对象特征建模。
套件中的其它光源是较弱的光源,可以提供额外的照明,补充主光源错过的点。
补光灯一般位于主光灯的对面(和相机都位于对象的同一侧),用来模拟场景中其他对象的漫反射。照亮主光灯照不到的地方,同时维持对比度。
头灯总是位于相机位置,降低主光灯和补光灯照射的区域之间的对比度。
两个背光灯,一个位于观察者看到的对象左侧,一个位于右侧,填补了对象背后的高对比度区域。
为了加强不同灯光之间的联系,补光灯、背光灯和头灯的强度值被设置为与主光灯亮度的比率。因此场景中所有光源的亮度都能通过改变主光灯的强度来改变。
所有光都有方向,照射无限远并且不衰减。光会随着相机移动。
8.2 在显示时设置灯光
初始化参数LightKit(key=(), fill=(), back=(), head=(), maintain_luminance=False)
key、fill、back、head分别填主光、补光、背光和头光的控制参数,均为字典格式。
参数字典允许的键如下:
warmth
,色温,范围[0,1]
。0是蓝色冷光,1是红色热光,0.5是自然光。
intensity
,主光光强。主光光强默认为1。
ratio
,非主光的光强,填比例值。
elevation
,灯位置上下提升的角度。
azimuth
,灯位置的转动的角度。
灯光默认是关闭的,打开灯效:
s = vedo.Sphere()
lit = vedo.LightKit()
vedo.show(s, lit)
LightKit是单例的对象,每次窗口展示,即使分了不同的框,使用的仍然是同一个
LightKit
实例。
因此,上面的图是两次程序运行合并后的图。后续的灯光测试也都是多次运行合并的结果。
测试主光的不同参数的效果:
s = vedo.Sphere()
lit = vedo.LightKit(key={"warmth": 0})
vedo.show(s, lit)
不同色温:
不同elevation
高度。默认灯光高度是45度左右。
不同azimuth
转角:
c.update()
更新场景中的光照状态。
以上整理了visual
的三个类VolumeVisual
、Actor2D
、LightKit
的用法。
更多关于数据可视化的内容参考:Python数据可视化笔记
相关文章:

Python的3D可视化库【vedo】1-4 (visual模块) 体素可视化、光照控制、Actor2D对象
文章目录 6. VolumeVisual6.1 关于体素6.2 显示效果6.2.1 遮蔽6.2.2 木纹或磨砂效果 6.3 颜色和透明度6.3.1 透明度衰减单位6.3.2 划分透明度标量梯度6.3.3 设置颜色或渐变6.3.4 标量的计算模式6.3.5 标量的插值方式 6.4 过滤6.4.1 按单元格id隐藏单元格6.4.2 按二进制矩阵设置…...

使用html和JavaScript实现一个简易的物业管理系统
码实现了一个简易的物业管理系统,主要使用了以下技术和功能: 1.主要技术 使用的技术: HTML: 用于构建网页的基本结构。包括表单、表格、按钮等元素。 CSS: 用于美化网页的外观和布局。设置字体、颜色、边距、对齐方式等样式。 JavaScript…...
什么是纯虚函数?什么是抽象类?纯虚函数和抽象类在面向对象编程中的意义是什么?
纯虚函数 纯虚函数是一个在基类中声明但不实现的虚函数。它的声明方式是在函数声明的末尾添加 0。这意味着这个函数没有提供具体的实现,任何继承这个基类的派生类都必须提供这个函数的实现,否则它们也会变成抽象类,无法实例化。 示例&#…...
#Ts篇: Record<string, number> 是 TypeScript 中的一种类型定义,它表示一个键值对集合
Record<string, number> 是 TypeScript 中的一种类型定义,它表示一个键值对集合,其中键的类型是 string,而值的类型是 number。具体来说,Record<K, T> 是 TypeScript 的一个内置高级类型,用于根据传入的键…...

Exp 智能协同管理系统前端首页框架开发
一、 需求分析 本案例的主要目标是开发一个智能学习辅助系统的前端界面,涵盖以下功能模块: 首页:显示系统的总体概览和关键功能介绍。 班级学员管理:实现班级管理和学员管理。 系统信息管理:管理部门和员工信息。 …...
C# 备份文件夹
C# 备份目标文件夹 方法1:通过 递归 或者 迭代 结合 C# 方法 参数说明: sourceFolder:源文件夹路径destinationFolder:目标路径excludeNames:源文件夹中不需备份的文件或文件夹路径哈希表errorLog:输出错…...
互联网信息泄露与安全扫描工具汇总
文章目录 1. 代码托管平台渠道泄露2. 网盘渠道泄露3. 文章渠道泄露4. 文档渠道泄露5. 暗网渠道泄露6. 互联网IP信誉度排查7. 网站挂马暗链扫描8. 互联网IP端口扫描9. 互联网资产漏洞扫描 1. 代码托管平台渠道泄露 https://github.com/ https://gitee.com/ https://gitcode.co…...

主导极点,传递函数零极点与时域模态
运动模态 控制系统的数学建模,可以采用微分方程或传递函数,两者具有相同的特征方程。在数学上,微分方程的解由特解和通解组成,具体求解过程可以参考:微分方程求解的三种解析方法。 如果 n n n阶微分方程,具…...
永恒之蓝漏洞利用什么端口
永恒之蓝(EternalBlue)是一个著名的漏洞,影响了 Windows 操作系统的 SMBv1 服务。它的漏洞编号是 CVE-2017-0144,该漏洞被用于 WannaCry 等勒索病毒的传播。 永恒之蓝漏洞利用的端口 永恒之蓝漏洞利用的是 SMB(Server…...

网络安全与防范
1.重要性 随着互联网的发达,各种WEB应用也变得越来越复杂,满足了用户的各种需求,但是随之而来的就是各种网络安全的问题。了解常见的前端攻击形式和保护我们的网站不受攻击是我们每个优秀fronter必备的技能。 2.分类 XSS攻击CSRF攻击网络劫…...
Navicat 17 功能简介 | SQL 开发
Navicat 17 功能简介 | SQL 开发 随着 17 版本的发布,Navicat 也带来了众多的新特性,包括兼容更多数据库、全新的模型设计、可视化智能 BI、智能数据分析、可视化查询解释、高质量数据字典、增强用户体验、扩展 MongoDB 功能、轻松固定查询结果、便捷URI…...

嵌入式系统中的并行编程模型:汇总解析与应用
概述:随着嵌入式系统处理能力的不断提升,并行编程在其中的应用愈发广泛。本文深入探讨了多种专门为嵌入式设计的并行编程模型,包括任务队列模型、消息传递模型、数据并行模型、异构多核并行模型、实时任务调度模型以及函数式并行模型。详细阐…...

VulkanSamples编译记录
按照BUILD.md说明,先安装依赖项 sudo apt-get install git build-essential libx11-xcb-dev \libxkbcommon-dev libwayland-dev libxrandr-dev 然后创建一个新文件夹build,在该目录下更新依赖项 cd VulkanSamples mkdir build cd build python ../scr…...
使用FabricJS对大图像应用滤镜(巨坑)
背景:我司在canvas的渲染模板的宽高都大于2048px 都几乎接近4000px,就导致使用FabricJS的滤镜功能图片显示异常 新知识:滤镜是对图片纹理的处理 FabricJS所能支持的最大图片纹理是2048的 一但图片超出2048的纹理尺寸 当应用滤镜时,图像会被剪切或者是缩…...

网页502 Bad Gateway nginx1.20.1报错与解决方法
目录 网页报错的原理 查到的502 Bad Gateway报错的原因 出现的问题和尝试解决 问题 解决 网页报错的原理 网页显示502 Bad Gateway 报错原理是用户访问服务器时,nginx代理服务器接收用户信息,但无法反馈给服务器,而出现的报错。 查到…...
Spring基础分析02-BeanFactory与ApplicationContext
大家好,今天和大家一起学习整理一下Spring 的BeanFactory和ApplicationContext内容和区别~ BeanFactory和ApplicationContext是Spring IoC容器的核心组件,负责管理应用程序中的Bean生命周期和配置。我们深入分析一下这两个接口的区别、使用场景及其提供…...

Rerender A Video 技术浅析(五):对象移除与自动配色
Rerender A Video 是一种基于深度学习和计算机视觉技术的视频处理工具,旨在通过智能算法对视频进行重新渲染和优化。 一、对象移除模块 1. 目标检测 1.1 概述 目标检测是对象移除的第一步,旨在识别视频中需要移除的对象并生成相应的掩码(m…...

Java项目实战II基于微信小程序的小区租拼车管理信息系统 (开发文档+数据库+源码)
目录 一、前言 二、技术介绍 三、系统实现 四、核心代码 五、源码获取 全栈码农以及毕业设计实战开发,CSDN平台Java领域新星创作者,专注于大学生项目实战开发、讲解和毕业答疑辅导。 一、前言 随着城市化进程的加速,小区居民对于出行方…...

【数字花园】数字花园(个人网站、博客)搭建经历汇总教程
目录 写在最最前面第一章:netlify免费搭建数字花园相关教程使用的平台步骤信息管理 第二章:本地部署数字花园数字花园网站本地手动部署方案1. 获取网站源码2.2 安装 Node.js 3. 项目部署3.1 安装项目依赖3.2 构建项目3.3 启动http服务器 4. 本地预览5. 在…...

WebRTC服务质量(03)- RTCP协议
一、前言: RTCP(RTP Control Protocol)是一种控制协议,与RTP(Real-time Transport Protocol)一起用于实时通信中的控制和反馈。RTCP负责监控和调节实时媒体流。通过不断交换RTCP信息,WebRTC应用…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)
说明: 想象一下,你正在用eNSP搭建一个虚拟的网络世界,里面有虚拟的路由器、交换机、电脑(PC)等等。这些设备都在你的电脑里面“运行”,它们之间可以互相通信,就像一个封闭的小王国。 但是&#…...
React Native 开发环境搭建(全平台详解)
React Native 开发环境搭建(全平台详解) 在开始使用 React Native 开发移动应用之前,正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南,涵盖 macOS 和 Windows 平台的配置步骤,如何在 Android 和 iOS…...
R语言AI模型部署方案:精准离线运行详解
R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...

基于ASP.NET+ SQL Server实现(Web)医院信息管理系统
医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上,开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识,在 vs 2017 平台上,进行 ASP.NET 应用程序和简易网站的开发;初步熟悉开发一…...
【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)
1.获取 authorizationCode: 2.利用 authorizationCode 获取 accessToken:文档中心 3.获取手机:文档中心 4.获取昵称头像:文档中心 首先创建 request 若要获取手机号,scope必填 phone,permissions 必填 …...
Element Plus 表单(el-form)中关于正整数输入的校验规则
目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入(联动)2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...
MinIO Docker 部署:仅开放一个端口
MinIO Docker 部署:仅开放一个端口 在实际的服务器部署中,出于安全和管理的考虑,我们可能只能开放一个端口。MinIO 是一个高性能的对象存储服务,支持 Docker 部署,但默认情况下它需要两个端口:一个是 API 端口(用于存储和访问数据),另一个是控制台端口(用于管理界面…...

wpf在image控件上快速显示内存图像
wpf在image控件上快速显示内存图像https://www.cnblogs.com/haodafeng/p/10431387.html 如果你在寻找能够快速在image控件刷新大图像(比如分辨率3000*3000的图像)的办法,尤其是想把内存中的裸数据(只有图像的数据,不包…...
前端中slice和splic的区别
1. slice slice 用于从数组中提取一部分元素,返回一个新的数组。 特点: 不修改原数组:slice 不会改变原数组,而是返回一个新的数组。提取数组的部分:slice 会根据指定的开始索引和结束索引提取数组的一部分。不包含…...
人工智能 - 在Dify、Coze、n8n、FastGPT和RAGFlow之间做出技术选型
在Dify、Coze、n8n、FastGPT和RAGFlow之间做出技术选型。这些平台各有侧重,适用场景差异显著。下面我将从核心功能定位、典型应用场景、真实体验痛点、选型决策关键点进行拆解,并提供具体场景下的推荐方案。 一、核心功能定位速览 平台核心定位技术栈亮…...