Python:基于matplotlib与mayavi的3D可视化

文章目录

  • 一、3D可视化常用方法
  • 二、三维图像在numpy、cv2、以及tifffile.imread中通道的区别
  • 三、项目实战
    • (1)基于matplotlib的3D可视化
    • (2)基于mayavi的3D可视化
      • (2.1)立方体
      • (2.2)3D灰度图像的体素体
      • (2.3)4D彩色图像的体素体

一、3D可视化常用方法

3D可视化是一种用于呈现三维数据的方法,它可以帮助我们更好地理解和分析复杂的空间结构和关系。在科学、工程、医学和其他领域,3D可视化常用于展示和研究体数据、空间模型、分子结构等。

以下是一些常见的用于3D可视化的工具和库:

  1. Matplotlib:Matplotlib 是一个常用的Python数据可视化库,其中的 mplot3d 模块提供了3D可视化功能,可以绘制三维图形和表面图。
  2. Mayavi:Mayavi 是一个基于VTK(Visualization Toolkit)的强大的3D科学数据可视化工具,它提供了丰富的功能和交互性,支持绘制体数据、曲面、等值面、轮廓线等。
  3. Plotly:Plotly 是一个交互式的数据可视化库,支持绘制各种类型的3D图形,包括散点图、线图、曲面图等,并提供了丰富的交互功能和布局选项。
  4. VTK(Visualization Toolkit):VTK 是一个强大的开源可视化库,提供了广泛的3D可视化算法和工具,可以用于构建复杂的可视化应用。
  5. ParaView:ParaView 是基于VTK的可视化软件,主要用于科学数据的可视化和分析,支持高效处理大规模数据,并提供了各种可视化技术和交互性。

二、三维图像在numpy、cv2、以及tifffile.imread中通道的区别

  • (1)NumPy:NumPy是一个强大的数值计算库,用于处理多维数组。在NumPy中,三维图像通常表示为形状为 (height, width, channels) 的数组。每个像素的通道值可以通过索引访问,例如 image[y, x, channel]。
  • (2)OpenCV (cv2):OpenCV是一个广泛使用的计算机视觉库,支持图像和视频处理。在OpenCV中,三维图像通常表示为形状为 (height, width, channels) 的NumPy数组。每个像素的通道值可以通过索引访问,例如 image[y, x, channel]。OpenCV还提供了许多图像处理和计算机视觉功能。
  • (3)tifffile.imread:tifffile是一个用于读取TIFF图像文件的库。在使用tifffile.imread加载三维图像时,它会返回一个形状为 (slices, height, width) 的NumPy数组,其中每个像素的值表示灰度强度。tifffile库通常用于处理多层的灰度图像。
    • height:表示图像的垂直维度,即行数或高度。
    • width:表示图像的水平维度,即列数或宽度。
    • channels:表示图像的通道数,对于彩色图像通常为3(红、绿、蓝),对于灰度图像通常为1。

三、项目实战

(1)基于matplotlib的3D可视化

200x200x200图像可视化:耗时问题比较严重,且任意视角的拖动都等需要等待较长时间。
在这里插入图片描述

import numpy as np
import matplotlib.pyplot as plt
import tifffile				# pip install tifffile# 加载 TIFF 图像
image_data = tifffile.imread('marked_image.tif')# 创建立体图像的坐标网格
x, y, z = np.meshgrid(np.arange(image_data.shape[1]+1), np.arange(image_data.shape[0]+1), np.arange(image_data.shape[2]+1))# 创建 3D 图形对象
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')# 绘制立体图像
ax.voxels(x, y, z, image_data, cmap='gray')# 设置坐标轴标签
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')# 显示图像
plt.show()

(2)基于mayavi的3D可视化

(2.1)立方体

在这里插入图片描述

import numpy as np
import tifffile				# pip install tifffile
from mayavi import mlab		# pip install mayavi# 加载tif图像
image_data = tifffile.imread('marked_image.tif')# 创建三维体素网格
x, y, z = np.indices(image_data.shape)
x = x.ravel()
y = y.ravel()
z = z.ravel()
values = image_data.ravel()# 绘制体素数据
mlab.figure(bgcolor=(1, 1, 1))
mlab.points3d(x, y, z, values, mode='cube', scale_factor=1, colormap='binary')
mlab.show()

(2.2)3D灰度图像的体素体

黑红色为255,其余颜色为0 ~ 255的值。
在这里插入图片描述

import numpy as np
import tifffile				# pip install tifffile
from mayavi import mlab		# pip install mayavi# (1)加载tif图像
image_data = tifffile.imread('marked_image.tif')		# 10x10x10# (2)创建Mayavi场景
mlab.figure(bgcolor=(1, 1, 1))# (3)创建三维体素数据
volume = mlab.pipeline.volume(mlab.pipeline.scalar_field(image_data))# (4)创建颜色映射,全黑体素置黑色,全白体素置白色
color_map = np.zeros((256, 4))
color_map[0] = (0, 0, 0, 0)  # 全黑体素的颜色为黑色
# color_map[255] = (1, 1, 1, 1)  # 全白体素的颜色为白色# (5)设置体素数据的颜色映射
volume.module_manager.scalar_lut_manager.lut.table = color_map# (6)添加坐标轴
mlab.outline(color=(0, 0, 0), line_width=3.0)  # 设置:边线的颜色、边线宽度# (7)设置Mayavi场景的渲染参数(可以改变 Mayavi 场景的视角和观察者与场景的距离,从而获得所需的视觉效果。)
mlab.view(azimuth=0, elevation=90, distance='auto')
########################################################################################################################
# mlab.view() 函数用于设置 Mayavi 场景的视角。在这里,azimuth 参数表示方位角(水平旋转),elevation 参数表示俯仰角(垂直旋转),distance 参数表示观察者与场景的距离。
#       azimuth: 水平旋转角度,以度数表示。0 表示正对前方,正值表示向右旋转,负值表示向左旋转。
#       elevation: 垂直旋转角度,以度数表示。90 表示从正上方俯视,0 表示水平视角,-90 表示从正下方仰视。
#       distance: 观察者与场景的距离。'auto' 表示自动调整距离以适应场景。
######################################################################################################################### (8)显示Mayavi场景
mlab.show()

(2.3)4D彩色图像的体素体

  • 在原始图像上,对检测到的所有细胞进行绘制,且细胞的彩色图为红色。
  • 全蓝表示对检测得到的细胞进行方框全覆盖,红色表示部分细胞方框只覆盖一部分(原因是对重叠目标检测时,对连接部分的剥离导致),其余颜色为原始图像的彩色图。

在这里插入图片描述

import numpy as np
from mayavi import mlab
import tifffile# 加载彩色3D图像
color_image = tifffile.imread('marked_image.tif')       # 10x10x10x3# 调整彩色3D图像的轴顺序与网格点的轴顺序一致
color_image = np.moveaxis(color_image, -1, 0)# 创建网格点
x, y, z = np.mgrid[0:color_image.shape[1], 0:color_image.shape[2], 0:color_image.shape[3]]# 显示彩色3D图像
mlab.figure(bgcolor=(1, 1, 1))
mlab.contour3d(x, y, z, color_image[0])
# Mayavi库的绘制函数通常期望三维数组作为输入,表示空间坐标和相应的数值。对于四维图像数据,您可以选择提取其中的一维作为绘制的数据,或者将四维数据转换为三维数据。mlab.outline(color=(0, 0, 0), line_width=3.0)  # 设置:边线的颜色、边线宽度
# (7)设置Mayavi场景的渲染参数(可以改变 Mayavi 场景的视角和观察者与场景的距离,从而获得所需的视觉效果。)
mlab.view(azimuth=0, elevation=90, distance='auto')
########################################################################################################################
# mlab.view() 函数用于设置 Mayavi 场景的视角。在这里,azimuth 参数表示方位角(水平旋转),elevation 参数表示俯仰角(垂直旋转),distance 参数表示观察者与场景的距离。
#       azimuth: 水平旋转角度,以度数表示。0 表示正对前方,正值表示向右旋转,负值表示向左旋转。
#       elevation: 垂直旋转角度,以度数表示。90 表示从正上方俯视,0 表示水平视角,-90 表示从正下方仰视。
#       distance: 观察者与场景的距离。'auto' 表示自动调整距离以适应场景。
########################################################################################################################
# (8)显示Mayavi场景
mlab.show()

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

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

相关文章

UI界面中的图标设计趋势与最佳实践

作为UI设计师,在日常的工作中,避免不了做图标规范。今天跟大家聊一聊,UI设计中的图标设计。 规范的重要性不用多说了,没有规范多个设计师绘制的图标会有很多差异,描边粗细、角度、圆角度等等。今天的文章和大家聊一下…

pythonocc进阶学习:faces的inner wire与outer wire

总目录 >> PythonOCC入门进阶到实战(目前已更新入门篇、基础篇和进阶篇) 我们在这篇文章中绘制了带有holes的面, 本篇是在读取到外部文件如brep,igs,stp后获取面的性质,寻找面中的wires的正向与逆向 只显示外wire from O…

STM32数字小键盘

基于STM32的数字小键盘 自己的键盘小键盘数字键坏了几个,准备自己用STM32做一个数字键盘。 硬件 找了一些资料,感谢知乎老哥。 原理图 采用的是主控是STM32F103RBT6,上拉1.5K接高速USB。按键采用的是矩阵按键。轴位可以自己选择。还接了一…

C++学习——类和对象(一)

C语言和C语言最大的区别在于在C当中引入了面向对象的编程思想,想要完全了解c当中的类和对象,就要从头开始一点一点的积累并学习。 一:什么是面向对象编程 我们之前学习的C语言属于面向过程的编程方法。举一个简单的例子来说:面向过…

Elasticsearch--客户端

Es客户端 语言无关 ​ java最常用的客户端是Java Client、Java Rest Client、Java Transport Client Java Client 从es7.17开始,官方推出Java Client,并且将Java Rest Client标为Deprecated(过期) 要求jdk至少要jdk8 具体用法…

LangChain大型语言模型(LLM)应用开发(六):Agents

LangChain是一个基于大语言模型(如ChatGPT)用于构建端到端语言模型应用的 Python 框架。它提供了一套工具、组件和接口,可简化创建由大型语言模型 (LLM) 和聊天模型提供支持的应用程序的过程。LangChain 可以轻松管理与语言模型的交互&#x…

Ajax详解

文章目录 1. 概述1.1 Ajax工作原理1.2 Ajax的作用1.3 同步异步 2. 原生Ajax3. Axios3.1 Axios的基本使用3.2 Axios快速入门3.3 请求方法的别名 1. 概述 Ajax 是 “Asynchronous JavaScript and XML”(异步 JavaScript 和 XML)的缩写。它是一种在无需重新…

Java版本企业工程项目管理系统平台源码(三控:进度组织、质量安全、预算资金成本、二平台:招采、设计管理)

工程项目管理软件(工程项目管理系统)对建设工程项目管理组织建设、项目策划决策、规划设计、施工建设到竣工交付、总结评估、运维运营,全过程、全方位的对项目进行综合管理 工程项目各模块及其功能点清单 一、系统管理 1、数据字典&#…

决赛结束,颁奖在即:2023隐私计算大会暨“星河杯”隐私计算大赛颁奖典礼震撼来袭!

7月11日-12日,首届“星河杯”隐私计算大赛4个赛题共计37支团队陆续完成决赛评审,决出的大赛获奖团队代表将受邀出席7月26日在青岛星河湾酒店举办的2023隐私计算大会暨首届“星河杯”隐私计算颁奖典礼。 2023隐私计算大会暨首届“星河杯”隐私计算大赛颁奖…

shell脚本中一个隐晦的bug

1.逻辑表达式if [ ! EXP PATTERN ]不能判断EXP结果为空的情形; 2.而逻辑表达式if [[ EXP ! PATTERN ]可以判断EXP结果为空的情形;

计算机网络 day10 DNAT问题 - 堡垒机 - WLAN

目录 DNAT策略拓扑图: 问题一:当我们访问内网的Web服务的时候,我们防火墙服务器的80端口和Web服务器的8000端口是否需要一直调用程序监控呢? DNAT的作用就是可以帮助我们进行路由转发功能 问题二:当我们在继续DNAT…

【VUE】拖动侧边栏以便自由调整左右两侧的宽度

效果 &#xff08;1&#xff09;拖动前 &#xff08;2&#xff09;拖动后 主要代码 <template><el-row class"contnet" :gutter"20">// 1. 左侧树<el-col id"left-tree" class"left-tree" :offset"0" :…