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

Posted

技术标签:

【中文标题】python imshow,将某个值设置为定义的颜色【英文标题】:python imshow, set certain value to defined color 【发布时间】:2016-10-09 17:07:38 【问题描述】:

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

有没有办法做到这一点?

【问题讨论】:

【参考方案1】:

我将回答如何将特定值设置为特定颜色而不考虑颜色图的一般问题。

在下面的代码中,出于说明目的,我认为这是您想要映射为白色的值 -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()

希望对你有帮助。

【讨论】:

我需要使用cmap = plt.get_cmap('spring')来获取cmap对象而不是matplotlib.cm.spring【参考方案2】:

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

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)

【讨论】:

【参考方案3】:

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

解决方案

解决方案涉及创建一个新的 3 维 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 https://***.com/a/40890587/7871710
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 被分配给蓝色。

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

【讨论】:

以上是关于python imshow,将某个值设置为定义的颜色的主要内容,如果未能解决你的问题,请参考以下文章

Python matplotlib imshow

设置两个 matplotlib imshow 图具有相同的颜色地图比例

将默认参数定义为全局变量

2021-10-30 vscode+Xming+树莓派使用python-opencv的imshow()函数时显现图像为灰色问题

工作区的颜值选择(简单)

Python OpenCV - imshow 不需要从 BGR 转换为 RGB