文章目录
- 一、3D可视化常用方法
- 二、三维图像在numpy、cv2、以及tifffile.imread中通道的区别
- 三、项目实战
- (1)基于matplotlib的3D可视化
- (2)基于mayavi的3D可视化
- (2.1)立方体
- (2.2)3D灰度图像的体素体
- (2.3)4D彩色图像的体素体
一、3D可视化常用方法
3D可视化是一种用于呈现三维数据的方法,它可以帮助我们更好地理解和分析复杂的空间结构和关系。在科学、工程、医学和其他领域,3D可视化常用于展示和研究体数据、空间模型、分子结构等。
以下是一些常见的用于3D可视化的工具和库:
Matplotlib
:Matplotlib 是一个常用的Python数据可视化库,其中的 mplot3d 模块提供了3D可视化功能,可以绘制三维图形和表面图。Mayavi
:Mayavi 是一个基于VTK(Visualization Toolkit)的强大的3D科学数据可视化工具,它提供了丰富的功能和交互性,支持绘制体数据、曲面、等值面、轮廓线等。Plotly
:Plotly 是一个交互式的数据可视化库,支持绘制各种类型的3D图形,包括散点图、线图、曲面图等,并提供了丰富的交互功能和布局选项。VTK(Visualization Toolkit)
:VTK 是一个强大的开源可视化库,提供了广泛的3D可视化算法和工具,可以用于构建复杂的可视化应用。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()