如何从3D图像的RGB值列表中提取唯一的RGB取值
3D图像RGB值唯一值提取方案
你提到的np.unique其实可以满足需求,只是需要先对数组做简单的维度调整,除此之外还有几种更高效的实现方式,都远快于你目前使用的三重嵌套循环:
方法1:使用numpy原生方法(性能最优)
你的3D图像本质是numpy数组,不需要单独转成列表处理,直接调整维度后调用np.unique即可:
# 假设你的3D_image形状为 (切片数, 高度, 宽度, 3),最后一维是RGB通道 # 先把所有像素点展平为二维数组,形状为 (总像素数, 3) flatten_rgb = 3D_image.reshape(-1, 3) # 按行去重,得到唯一的RGB值数组 rgb_values_unique = np.unique(flatten_rgb, axis=0)
如果最终需要列表格式,只需要在最后加.tolist()即可。
方法2:使用集合去重(适合纯列表场景)
如果你的RGB值确实是存储在列表中,只需要把不可哈希的列表类型转为可哈希的元组,就可以用集合快速去重:
# 先提取所有RGB值到一个列表 all_rgb = [tuple(pixel) for slice_ in 3D_image for row in slice_ for pixel in row] # 集合去重后转回列表格式 rgb_values_unique = [list(item) for item in set(all_rgb)]
注意:这种方法会打乱原始的RGB值出现顺序,如果需要保留顺序可以用下面的方法。
方法3:有序去重(保留首次出现顺序)
Python 3.7及以上版本字典默认保留插入顺序,可以用字典实现顺序保留的去重:
all_rgb = [tuple(pixel) for slice_ in 3D_image for row in slice_ for pixel in row] rgb_values_unique = [list(item) for item in dict.fromkeys(all_rgb).keys()]
内容的提问来源于stack exchange,提问作者sghosh
相关产品推荐
相关产品推荐

