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效果。
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))

alpha_unit

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值的效果:
alpha_grad
alpha_grad

6.3.3 设置颜色或渐变

v.cmap(c, alpha=None, vmin=None, vmax=None)
CommonVisual.color()效果一样。
c可以填单个颜色或颜色映射。单个颜色必须使用colors.colors中给定的英文颜色名称或colors.color_nicks给出的颜色缩写。

使用不同的c值的效果:
cmap

6.3.4 标量的计算模式

v.mode(mode=None)
指定体素的渲染模式。可选的值如下:

基类CommonVisualalpha方法可以通过输入二维序列来定义标量到实际透明度的转换方式。如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。标量值和透明度转换的值相乘,然后累加。即标量值用给定的透明度来缩放,又相加来产生结果颜色。结果图一般是灰度图。
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()

hide_voxels

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的三个类VolumeVisualActor2DLightKit的用法。

更多关于数据可视化的内容参考:Python数据可视化笔记

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/63755.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DAY5 C++运算符重载

1.类实现> 、<、!、||、&#xff01;和后自增、前自减、后自减运算符的重载 代码&#xff1a; #include <iostream>using namespace std; class Complex {int rel;int vir; public:Complex(){};Complex(int rel,int vir):rel(rel),vir(vir){cout << "…

qt 封装 调用 dll

这个目录下 &#xff0c;第一个收藏的这个 &#xff0c;可以用&#xff0c; 但是有几个地方要注意 第一.需要将dll的头文件添加到qt的文件夹里面 第二&#xff0c;需要在pro文件里面添加动态库路径 第三&#xff0c;如果调用dll失败&#xff0c;那么大概需要将dll文件放在e…

hbuilder 安卓app手机调试中基座如何设置

app端使用基座 手机在线预览功能 1.点击运行 2.点击运行到手机或者模拟器 3.制作自定义调试基座 4.先生成证书【可以看我上一篇文档写的有】&#xff0c;点击打包 5.打包出android自定义调试基座【android_debug.apk】,【就跟app打包一样需要等个几分钟】 6.点击运行到手…

快速将请求头构建成json结构

1.背景 有时候我们要爬虫(组包)请求一个资源数据,需要构建与原始请求一样的请求头,从浏览器复制过来的请求头,有很多,如果一个一个的配置成json有点慢,那么如何快速构建呢? 今天就使用正则表达式的方式实现 正则表达式实现快速将请求头构建成json结构 将冒号后边的换行符去掉…

Flink如何基于数据版本使用最新离线数据

业务场景 假设批量有一张商户表&#xff0c;表字段中有商户名称和商户分类两个字段。 批量需要将最新的商户名称和分类的映射关系推到hbase供实时使用。 原实现方案 a.原方案内容 为解决批量晚批问题&#xff0c;批量推送hbase表时一份数据产生两类rowkey&#xff1a;T-1和…

基于事件驱动的websocket简单实现

websocket的实现 什么是websocket&#xff1f; WebSocket 是一种网络通信协议&#xff0c;旨在为客户端和服务器之间提供全双工、实时的通信通道。它是在 HTML5 规范中引入的&#xff0c;可以让浏览器与服务器进行持久化连接&#xff0c;以便实现低延迟的数据交换。 WebSock…

F5-TTS文本语音合成模型的使用和接口封装

F5-TTS文本语音生成模型 1. F5-TTS的简介 2024年10月8日&#xff0c;上海交通大学团队发布&#xff0c;F5-TTS (A Fairytaler that Fakes Fluent and Faithful Speech with Flow Matching) 是一款基于扩散Transformer和ConvNeXt V2的文本转语音 (TTS) 模型。F5-TTS旨在生成流…

elementui table子级tree懒加载bug

1. 删除子级刷新列表子级依然显示 2.更新状态子级列表未刷新 3.编辑子级后刷新页面显示状态未变更 el-table 树表格load源码 首先&#xff0c;load可以执行&#xff0c;但是只剩一个子节点就有问题&#xff0c;那么就直接可以定位bug在load方法里&#xff1a; 文件路径&am…

SQL语句错误号:Incorrect integer value: ‘‘ for column ‘poi_id‘ at

SQL语句错误号&#xff1a;Incorrect integer value: for column poi_id at通用解决方案 在MySQL 5.7中&#xff0c;如果你遇到 Incorrect integer value: for column poi_id at row 1 错误&#xff0c;这通常意味着你尝试将一个空字符串插入到需要整数值的字段中。以下是几…

在springBoot项目如何对本地配置文件和云服务配置文件独立配置

springBoot中配置文件本地和云服务配置文件独立配置 1.首先我们创建好一个springBoot项目后&#xff0c;需要再创建两个application.yml配置文件&#xff0c;如图 2.然后在各自的配置文件中配置各自环境的信息&#xff0c;注意的是在创建各自环境的yml文件时&#xff0c;必须…

【分布式事务】二、NET8分布式事务实践: DotNetCore.CAP 框架(本地消息表) 、 消息队列(RabbitMQ)、 多类型数据库(MySql、MongoDB)

介绍 DotNetCore.CAP简称CAP, [CAP]是一个用来解决微服务或者分布式系统中分布式事务问题的一个开源项目解决方案, 同样可以用来作为 EventBus 使用,CAP 拥有自己的特色,它不要求使用者发送消息或者处理消息的时候实现或者继承任何接口,拥有非常高的灵活性。我们一直坚信…

aippt:AI 智能生成 PPT 的开源项目

aippt&#xff1a;AI 智能生成 PPT 的开源项目 在现代办公和学习中&#xff0c;PPT&#xff08;PowerPoint Presentation&#xff09;是一种非常重要的展示工具。然而&#xff0c;制作一份高质量的PPT往往需要花费大量的时间和精力。为了解决这一问题&#xff0c;aippt项目应运…

一文说清flink从编码到部署上线

引言&#xff1a;目前flink的文章比较多&#xff0c;但一般都关注某一特定方面&#xff0c;很少有一个文章&#xff0c;从一个简单的例子入手&#xff0c;说清楚从编码、构建、部署全流程是怎么样的。所以编写本文&#xff0c;自己做个记录备查同时跟大家分享一下。本文以简单的…

在VMWare上安装openEuler 22.03-LTS

文章目录 1. openEluer 22.03-LTS概述2. 安装openEluer 22.03-LTS2.1 安装配置虚拟机2.2 安装openEuler2.3 配置虚拟机静态IP地址 3. 使用yum和dnf3.1 使用dnf安装软件包3.2 使用dnf卸载软件包3.3 使用yum安装软件包3.4 使用yum卸载软件包 4. 利用FinalShell连接Server015. Bas…

短信验证码burp姿势

首先声明&#xff0c;本文仅仅作为学习使用&#xff0c;因个人原因导致的后果&#xff0c;皆有个人承担&#xff0c;本人没有任何责任。 在之前的burp学习中&#xff0c;我们学习了图片验证码的突破&#xff0c;但是现实中还有很多短信验证码&#xff0c;在此我介绍几种短信验…

【软件测试面试题】测试理论/基础面试(持续更新)

Hi&#xff0c;大家好。最近很多朋友都在说今年的互联网行情不好&#xff0c;面试很难&#xff0c;不知道怎么复习&#xff0c;我最近总结了一份在软件测试面试中比较常见的测试理论/基础面试面试题合集&#xff0c;希望对大家有帮助。建议点赞收藏再阅读&#xff0c;防止丢失&…

在 Windows WSL 上部署 Ollama 和大语言模型:从镜像冗余问题看 Docker 最佳实践20241208

&#x1f6e0;️ 在 Windows WSL 上部署 Ollama 和大语言模型&#xff1a;从镜像冗余问题看 Docker 最佳实践 ⭐ 引言 随着大语言模型&#xff08;LLM&#xff09;和人工智能技术的迅猛发展&#xff0c;开发者们越来越多地尝试在本地环境中部署模型进行实验。 但部署过程中常…

ContOS7安装完成后的一系列问题

问题1&#xff1a;constos7,安装完后&#xff0c;无法使用yum,导致无法安装任何东西&#xff0c; 解决&#xff1a;原因是国外的镜像地址有问题&#xff0c;改为国内的地址。 查看yum的状态 yum repolist 2.执行如下命令&#xff0c;更换yum源 bash <(curl -sSL https://…

使用JavaScrip和HTML搭建一个简单的博客网站系统

搭建一个简单的博客网站系统&#xff0c;我们需要创建几个基本的页面和功能&#xff1a;登录、注册、文章发布等。这里我们先实现一个基础版本&#xff0c;包括用户登录、注册以及文章发布的功能。由于这是一个简化版的示例&#xff0c;我们将所有逻辑集成在一个HTML文件中&…

uniapp扭蛋机组件

做了一个uniapp的扭蛋机组件&#xff0c;可以前往下载地址下载 仅测试了vue2、3、h5页面微信小程序&#xff0c;理论支持全平台 使用方法简单&#xff0c;具有待机动效、抽奖中动效、掉落奖品动效&#xff0c;可以替换奖品图片&#xff0c;足以满足大部分抽奖页面需求。 示例图…