当前位置: 首页 > news >正文

Python实现点云渲染可视化杂记(直接、彩虹渐变、柱状、饼状和T-SNE赋色)

        今天我们来分享点云的渲染可视化方法。一般来说,我们都是使用点云原色或者直接使用pcd.paint_uniform_color()函数进行点云赋色。可以用,但是吧,不好看。所以本节我们来探索几种比较好的点云可视化方法。

今天的主角依然是我们的老朋友————兔砸!

一、直接赋值可视化

1.1、直接可视化程序

import numpy as np
import open3d as o3d# 直接转换颜色,从蓝色到绿色到黄色到红色
color_gradient = np.array([    # 定义数组[0.0, 0.0, 1.0],  # 蓝色[0.0, 1.0, 0.0],  # 绿色[1.0, 1.0, 0.0],  # 黄色[1.0, 0.0, 0.0]   # 红色
])# 定义一个函数,根据归一化值选择颜色
def get_color_from_gradient(value, gradient):index = int(value * (len(gradient) - 1))return gradient[index]if __name__ == '__main__':# 读取点云文件pcd = o3d.io.read_point_cloud('E:/CSDN/规则点云/bunny.pcd')points = np.asarray(pcd.points)# 计算Z值取值范围zdist = points[:, 2]min_z = zdist.min()max_z = zdist.max()# 归一化Z值normalized_z = (zdist - min_z) / (max_z - min_z)# 使用颜色转变数组为点云赋色colors = np.array([get_color_from_gradient(z, color_gradient) for z in normalized_z])  # 直接转换pcd.colors = o3d.utility.Vector3dVector(colors)# 可视化点云o3d.visualization.draw_geometries([pcd], window_name="直接转换赋色",width=800, height=600,left=50, top=50)

1.2、直接可视化程序

二、彩虹颜色渐变赋色可视化

2.1、彩虹颜色渐变赋色程序

import numpy as np
import open3d as o3d# 定义彩虹颜色映射函数
def rainbow_color_map(value):if value < 0.1667:return np.array([1, value * 6, 0])  # 红色到黄色elif value < 0.3333:return np.array([2 - value * 6, 1, 0])  # 黄色到绿色elif value < 0.5:return np.array([0, 1, (value - 0.3333) * 6])  # 绿色到青色elif value < 0.6667:return np.array([0, 2 - (value - 0.3333) * 6, 1])  # 青色到蓝色elif value < 0.8333:return np.array([(value - 0.6667) * 6, 0, 1])  # 蓝色到紫色else:return np.array([1, 0, 2 - (value - 0.6667) * 6])  # 紫色到红色# 定义一个函数,根据归一化值选择颜色
def get_color_from_gradient(value, gradient):index = int(value * (len(gradient) - 1))return gradient[index]if __name__ == '__main__':# 读取点云文件pcd = o3d.io.read_point_cloud('E:/CSDN/规则点云/bunny.pcd')points = np.asarray(pcd.points)# 计算Z值取值范围zdist = points[:, 2]min_z = zdist.min()max_z = zdist.max()# 归一化Z值normalized_z = (zdist - min_z) / (max_z - min_z)# 使用彩虹颜色渐变为点云赋色colors = np.array([rainbow_color_map(z) for z in normalized_z])  # 渐变数组pcd.colors = o3d.utility.Vector3dVector(colors)# 可视化点云o3d.visualization.draw_geometries([pcd], window_name="彩虹颜色渐变赋色",width=800, height=600,left=50, top=50)

2.2、彩虹颜色渐变赋色结果

三、柱状图渐变可视化

3.1、柱状图渐变可视化程序

import numpy as np
import open3d as o3d
import matplotlib.pyplot as plt# 读取点云文件
pcd = o3d.io.read_point_cloud('E:/CSDN/规则点云/bunny.pcd')
points = np.asarray(pcd.points)# 计算Z值取值范围
zdist = points[:, 2]
min_z = zdist.min()
max_z = zdist.max()# 归一化Z值
normalized_z = (zdist - min_z) / (max_z - min_z)# 使用柱状图生成颜色映射
fig, ax = plt.subplots()
n, bins, patches = ax.hist(zdist, bins=20, color='blue', alpha=0.7)
bin_centers = 0.5 * (bins[:-1] + bins[1:])# 归一化柱状图的值
bin_centers_normalized = (bin_centers - min_z) / (max_z - min_z)# 为每个柱子设置颜色
for bin_center, patch in zip(bin_centers_normalized, patches):color = plt.cm.viridis(bin_center)  # 使用viridis颜色映射patch.set_facecolor(color)# 获取颜色映射
colors = plt.cm.viridis(normalized_z)# 为点云赋色
pcd.colors = o3d.utility.Vector3dVector(colors[:, :3])# 可视化点云
o3d.visualization.draw_geometries([pcd], window_name="柱状图颜色映射",width=800, height=600,left=50, top=50)# 显示柱状图
plt.show()

3.2、柱状图渐变可视化结果

四、饼状图渐变可视化

4.1、饼状图渐变可视化程序

import numpy as np
import open3d as o3d
import matplotlib.pyplot as plt# 读取点云文件
pcd = o3d.io.read_point_cloud('E:/CSDN/规则点云/bunny.pcd')
points = np.asarray(pcd.points)# 计算Z值取值范围
zdist = points[:, 2]
min_z = zdist.min()
max_z = zdist.max()# 归一化Z值
normalized_z = (zdist - min_z) / (max_z - min_z)# 使用饼图生成颜色映射
fig, ax = plt.subplots()
n, bins = np.histogram(zdist, bins=20)
bin_centers = 0.5 * (bins[:-1] + bins[1:])# 归一化柱状图的值
bin_centers_normalized = (bin_centers - min_z) / (max_z - min_z)# 为每个柱子设置颜色
colors = [plt.cm.viridis(bin_center) for bin_center in bin_centers_normalized]# 绘制饼图
ax.pie(n, labels=bin_centers, colors=colors, autopct='%1.1f%%', startangle=140)# 获取颜色映射
colors = plt.cm.viridis(normalized_z)# 为点云赋色
pcd.colors = o3d.utility.Vector3dVector(colors[:, :3])# 可视化点云
o3d.visualization.draw_geometries([pcd], window_name="饼图颜色映射",width=800, height=600,left=50, top=50)# 显示饼图
plt.show()

4.2、饼状图渐变可视化结果

五、T-SNE渐变可视化

        T-SNE是一种降维方法,同样的还有UMAP降维。这些降维的方法可以让点云以二维的形式显示,然后我们将之进行渐变可视化,可以得到新颖的点云颜色表达方式。这里只演示T-SNE可视化,因为UMAP降维需要python3.8,咱们这个从一开始就强调是python3.7,原因见第一节。

5.1 T-SNE渐变可视化程序

import numpy as np
import open3d as o3d
from sklearn.manifold import TSNE
import matplotlib.pyplot as plt# 读取点云文件
pcd = o3d.io.read_point_cloud('E:/CSDN/规则点云/bunny.pcd')
points = np.asarray(pcd.points)# 使用T-SNE降维到二维
tsne = TSNE(n_components=2, random_state=42)
points_2d = tsne.fit_transform(points)# 归一化二维坐标
normalized_x = (points_2d[:, 0] - points_2d[:, 0].min()) / (points_2d[:, 0].max() - points_2d[:, 0].min())
normalized_y = (points_2d[:, 1] - points_2d[:, 1].min()) / (points_2d[:, 1].max() - points_2d[:, 1].min())# 使用二维坐标生成颜色
colors = np.array([plt.cm.viridis(x) for x in normalized_x])# 为点云赋色
pcd.colors = o3d.utility.Vector3dVector(colors[:, :3])# 可视化点云
o3d.visualization.draw_geometries([pcd], window_name="T-SNE颜色映射",width=800, height=600,left=50, top=50)# 可视化T-SNE降维结果
plt.scatter(points_2d[:, 0], points_2d[:, 1], c=normalized_x, cmap='viridis')
plt.colorbar()
plt.title("T-SNE降维结果")
plt.show()

5.2 T-SNE渐变可视化结果

大家看,原来点云有这么多可视化方法,你还在用原始显示么?土狗(doge.jpg)

就酱,下次见^-^

http://www.dtcms.com/a/362252.html

相关文章:

  • The Algorithmic Foundations of Differential Privacy - 2
  • 8Lane V-by-One HS LVDS FMC Card
  • 【开题答辩全过程】以 智慧药店管理系统的实现与设计为例,包含答辩的问题和答案
  • 基于单片机智能空调/温度控制系统
  • GaussDB 集群故障cm_ctl: can‘t connect to cm_server
  • API安全厂商F5首发后量子加密方案,为企业后量子时代加固防线
  • Java中方法的参数传递
  • TFT屏幕:STM32硬件SPI+DMA+队列自动传输
  • 【无标题】训练、推理适用的数据类型
  • C++ 学习与 CLion 使用:(五)数据类型,包括整型、实型、字符型、转义字符、字符串、布尔型
  • 椭圆曲线的数学基础
  • 【算法专题训练】17、双向链表
  • openEuler2403部署Redis8集群
  • AI推理方法演进:Chain-of-Thought、Tree-of-Thought与Graph-of-Thought技术对比分析
  • Spring 控制器参数注解
  • LangGraph 边(Edge)机制完全指南
  • Java 不支持在非静态内部类中声明静态 Static declarations in inner classes are not supported异常处理
  • 2025我“生发”了『折行』|『内注』|『终端正偿』|『中文负偿』四大“邪术”(前二造福python代码阅读者;后二助力所有艺术人)
  • nrf52840 解锁
  • 2025年09月01日Github流行趋势
  • 数据结构初阶:详解栈和队列(下)——队列
  • 并发编程--线程池(1)线程池概念 Java 线程池体系(Executor、ThreadPoolExecutor、Executors)
  • resnet网络
  • 甲烷浓度时空演变趋势分析与异常值计算(附下载脚本)
  • 洛谷 P5836 [USACO19DEC] Milk Visits S-普及/提高-
  • 基于MCP架构的OpenWeather API服务端设计与实现
  • jetson开发板Ubuntu系统Docker中使用 MySQL 数据库详解-安装与配置指南
  • Python上下文管理器与资源管理
  • 基于51单片机停车场车位引导系统设计
  • 四个典型框架对比