python imshow,将特定值设置为定义的颜色

python imshow, set certain value to defined color

我有一个 RGB 图像,我用 matplotlib.pyplot.imshow 绘制它并且工作正常。 但是现在我想改变情节,当图片的值为例如 1 时,情节的颜色应该在所有这些位置变为白色。

有办法吗?

假设您的图像是单通道图像而不是三通道图像,则可以通过定义将索引(例如灰度强度或图片值)映射到颜色的调色板来执行所需的任务:

import numpy as np
import matplotlib.pyplot as plt

palette = np.array([[  0,   0,   0],   # black
                    [255,   0,   0],   # red
                    [  0, 255,   0],   # green
                    [  0,   0, 255],   # blue
                    [255, 255, 255]])  # white
I = np.array([[ 0, 1, 2, 0],    # 2 rows, 4 columns, 1 channel
              [ 0, 3, 4, 0]])

图像转换通过NumPy's broadcasting高效完成:

RGB = palette[I]

转换后的图像是这样的:

>>> RGB
array([[[  0,  0,    0],  # 2 rows, 4 columns, 3 channels
        [255,  0,    0],
        [  0, 255,   0],
        [  0,   0,   0]],
       
       [[  0,   0,   0],
        [  0,   0, 255],
        [255, 255, 255],
        [  0,   0,   0]]])

plt.imshow(RGB)

我将回答一般性问题如何将特定值设置为特定颜色,而不考虑颜色映射

在下面的代码中,出于说明目的,我认为这是您要映射为白色的值 -1。您会想要为您的代码做一些不同的事情。

此技术使用 masked array 设置您的数据等于 -1(您希望映射的值)的部分,然后使用 cmap.set_bad() 将颜色白色分配给该值.

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

value = -1
data = np.arange(100).reshape((10, 10))
data[5, :] = -1  # Values to set -1

masked_array = np.ma.masked_where(data == value, data)

cmap = matplotlib.cm.spring  # Can be any colormap that you want after the cm
cmap.set_bad(color='white')

plt.imshow(masked_array, cmap=cmap)
plt.show()

希望对您有所帮助。

我将针对原始问题提出一个解决方案,该解决方案可扩展为分别为几种不同的颜色分配多个值。

解决方案

解决方案涉及创建一个新的三维 NumPy ndarray,它在每个 i,j 位置包含一个具有 RGB 值的 NumPy 数组。然后用 imshow(或 matshow)

绘制这个新的 data3d 数组
# import packages 
import numpy as np
import matplotlib
import matplotlib.pyplot as plt

# generate data 
np.random.seed(42)
data = np.random.randint(low=1, high=4, size=(10,10)) # possible values are 1,2,3

# define color map 
color_map = {1: np.array([255, 0, 0]), # red
             2: np.array([0, 255, 0]), # green
             3: np.array([0, 0, 255])} # blue 

# make a 3d numpy array that has a color channel dimension   
data_3d = np.ndarray(shape=(data.shape[0], data.shape[1], 3), dtype=int)
for i in range(0, data.shape[0]):
    for j in range(0, data.shape[1]):
        data_3d[i][j] = color_map[data[i][j]]

# display the plot 
fig, ax = plt.subplots(1,1)
ax.imshow(data_3d)

# add numbers to the plot 
# thanks to tmdavison answer here 
for i in range(0, data.shape[0]):
    for j in range(0, data.shape[1]):
        c = data[j,i]
        ax.text(i, j, str(c), va='center', ha='center')

背景 我最近遇到一个问题,我需要绘制几个单通道矩阵并为每个矩阵中的 1、2 和 3 分配不同的颜色。 1、2 和 3 的顺序根据矩阵而变化,这意味着使用定义的配色方案通常会导致将不同颜色分配给不同矩阵中的相同值。例如,在第一个矩阵中,1 被分配给红色,而在第二个矩阵中,1 被分配给蓝色。

我花了很多时间在 Whosebug 上搜索解决方案,但从未找到任何有效的方法。最终,我能够自己解决一个问题。这是这个问题的解决方案,它可以扩展到多个值并且独立于主矩阵中值的排序。它也适用于 matshow 而不是 imshow。