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)
就酱,下次见^-^