【问题标题】:python imshow, set certain value to defined colorpython imshow,将某个值设置为定义的颜色
【发布时间】:2021-11-01 05:21:57
【问题描述】:

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

有没有办法做到这一点?

【问题讨论】:

    标签: python image colors imshow


    【解决方案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://stackoverflow.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 被分配给蓝色。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-04-20
        • 1970-01-01
        • 2020-10-14
        • 1970-01-01
        • 1970-01-01
        • 2012-03-31
        • 1970-01-01
        相关资源
        最近更新 更多