首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >python imshow,将某些值设置为定义的颜色

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

Stack Overflow用户
提问于 2016-06-09 15:20:35
回答 3查看 14.4K关注 0票数 9

我有一个RGB图像,我用matplotlib.pyplot.imshow绘制它,它工作得很好。但是现在我想要改变图,在图片的值是例如1的地方,图的颜色在所有这些位置都应该变成白色。

有没有办法做到这一点?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-06-09 16:27:12

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

代码语言:javascript
复制
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高效地完成图像转换

代码语言:javascript
复制
RGB = palette[I]

这是变换后的图像的样子:

代码语言:javascript
复制
>>> 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
EN

Stack Overflow用户

发布于 2017-03-10 21:50:39

我将回答的一般问题,即如何在不考虑颜色映射的情况下为特定颜色设置特定值。

为了说明起见,在下面的代码中,我假设这是您希望映射为白色的值-1。你会想要为你的代码做一些不同的事情。

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

代码语言:javascript
复制
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()

希望能有所帮助。

票数 22
EN

Stack Overflow用户

发布于 2021-03-27 01:34:03

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

解决方案

该解决方案涉及创建在每个i,j位置处包含具有RGB值的NumPy阵列的新的三维RGB。然后使用imshow (或matshow)绘制这个新的data3d数组

代码语言:javascript
复制
# 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。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37719304

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档