在Matplotlib中生成16位色彩映射

4
我想使用matplotlib中的RGB colormap对16位深度图像进行着色。从技术上讲,每个通道8位的3个通道应该足以为所有2^16可能的深度值提供不同的rgb值。
即使原始深度图像具有两倍以上的值,标准颜色映射“viridis”仍然会产生小于1000个不同的值。
我尝试使用更多样本创建颜色映射plt.get_cmap('viridis', 2**16),但这仍然不够。
以下是一些描述我正在尝试做的事情的代码:
def depth_to_rgb(path):   
    depth_map = Image.open(path)
    pixel = np.array(depth_map)
    pixel = (pixel - np.min(pixel)) / np.ptp(pixel)
    cm = plt.get_cmap('viridis', 2**16)
    pixel_colored = np.uint8(np.rint(cm(pixel) * 255))[:, :, :3]
    return Image.fromarray(pixel_colored)

我可以通过创建自定义的颜色映射略微增加地图上不同值的数量,但仍然不足:
cm = mlp.colors.LinearSegmentedColormap.from_list("",
["red", "green", "yellow"], N=2**16)

有没有足够的值的颜色映射表,或者我该如何创建一个?与Pillow图像库相关的解决方案也会受到赞赏。
编辑
显然(感谢 ImportanceOfBeingErnest),结果的颜色映射表确实有2 ** 16个值,但是 np.uint8(np.rint(cm(pixel)* 255))导致一些值落在相同的颜色上。我只打印了结果图像中不同颜色的数量。我想我必须进行一种不同的映射,但原始问题已得到回答。
1个回答

5

Viridis共有256种颜色。它是ListedColormap,这意味着当对其进行重采样时,它仍然会给出最初的颜色数目。所以plt.get_cmap('viridis', 2**16)仍将获得256种初始颜色。

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.colors as mcolors

cmap = plt.get_cmap("viridis", 2**16)
a = cmap(np.linspace(0,1,2**16))
print(len(a))
print(len(np.unique(a, axis=0)))

打印

65536
256

但是使用更大的N,LinearSegmentedColormap.from_list应该可以工作。

cmap = mcolors.LinearSegmentedColormap.from_list("", ["red", "green", "yellow"], N=2**16)
a = cmap(np.linspace(0,1,2**16))
print(len(a))
print(len(np.unique(a, axis=0)))

打印

65536
65536

如果您想要一个包含2^16个条目的viridis色图表,您仍然可以在现有256种颜色之间进行插值。
cmap = mcolors.LinearSegmentedColormap.from_list("", plt.cm.viridis.colors, N=2**16)

这将导致与上面相同的65536种颜色。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接