如何基于TIF图像像素强度在Python中生成3D图?
基于TIF像素强度生成3D可视化图的实现方案
所需工具库
matplotlib:负责3D图形绘制pillow/rasterio:读取TIF图像数据(前者适合普通TIF,后者更适配遥感多波段TIF)numpy:处理像素数值矩阵
先通过pip安装依赖:
pip install matplotlib pillow numpy rasterio
实现代码
方案1:普通TIF图像(单通道/彩色转灰度)
import numpy as np from PIL import Image import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D # 读取TIF并转灰度 img = Image.open("your_image.tif") img_gray = img.convert("L") z = np.array(img_gray) # 像素强度作为Z轴高度 # 生成像素坐标网格 x = np.arange(z.shape[1]) y = np.arange(z.shape[0]) X, Y = np.meshgrid(x, y) # 创建3D画布 fig = plt.figure(figsize=(12, 8)) ax = fig.add_subplot(111, projection='3d') # 绘制3D表面图,匹配示例风格 surf = ax.plot_surface(X, Y, z, cmap='terrain', edgecolor='none', alpha=0.9) # 配置坐标轴与颜色条 ax.set_xlabel('X 像素') ax.set_ylabel('Y 像素') ax.set_zlabel('像素强度') fig.colorbar(surf, shrink=0.5, aspect=8) # 调整视角(可根据需求修改elev/azim数值) ax.view_init(elev=35, azim=-70) # 保存或显示结果 plt.savefig("3d_tif_result.png", dpi=300) plt.show()
方案2:遥感多波段TIF(读取指定波段)
如果你的TIF是类似示例的遥感影像,用rasterio读取特定波段更合适:
import numpy as np import rasterio import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D with rasterio.open("your_image.tif") as src: z = src.read(1) # 读取第一波段数据作为Z轴高度 # 后续坐标生成、绘图代码同方案1 x = np.arange(z.shape[1]) y = np.arange(z.shape[0]) X, Y = np.meshgrid(x, y) fig = plt.figure(figsize=(12, 8)) ax = fig.add_subplot(111, projection='3d') surf = ax.plot_surface(X, Y, z, cmap='terrain', edgecolor='none', alpha=0.9) ax.set_xlabel('X 像素') ax.set_ylabel('Y 像素') ax.set_zlabel('波段反射率') fig.colorbar(surf, shrink=0.5, aspect=8) ax.view_init(elev=35, azim=-70) plt.savefig("3d_remote_sensing_result.png", dpi=300) plt.show()
调整技巧
- 颜色映射:修改
cmap参数,比如viridis、jet、terrain等,terrain更接近示例的地貌色调 - 视角调整:修改
ax.view_init(elev=XX, azim=XX)中的数值,elev是垂直仰角,azim是水平方位角 - 性能优化:如果图像尺寸过大,可对
z数组做降采样,比如z = z[::2, ::2],减少数据量提升绘制速度
内容的提问来源于stack exchange,提问作者code_lover
相关产品推荐
相关产品推荐

