Python自定义颜色映射的方法


前言

数据可视化的颜色映射方法在热成像、仿真模拟等诸多地方均有应用,但官方预设方案有时候和实际应用中想要的结果差异较大,常常需要自己设定想要的方案来实现;目前没有看到有人在Python中用不同库及自定义映射方案来做颜色映射效果的相关文章,遂整理记录分享下相关方法。


一、什么是颜色映射?

颜色映射(Color Mapping)是一种将数据映射到颜色空间的技术,常用于数据可视化中;通过将不同范围的数据值映射到特定的颜色,我们可以更直观地观察和理解数据的分布和特征;在编程中,颜色映射通常用于创建热力图、等高线图、伪彩色图像等。

二、OpenCV中颜色预设方案

1.引入库并获取预设方案

代码如下:

import cv2
colormaps = [attr for attr in dir(cv2) if attr.startswith('COLORMAP_')]
print(colormaps)

结果(共有22种预设方案):

['COLORMAP_AUTUMN', 'COLORMAP_BONE', 'COLORMAP_CIVIDIS', 
'COLORMAP_COOL', 'COLORMAP_DEEPGREEN', 'COLORMAP_HOT', 
'COLORMAP_HSV', 'COLORMAP_INFERNO', 'COLORMAP_JET', 
'COLORMAP_MAGMA', 'COLORMAP_OCEAN', 'COLORMAP_PARULA',
'COLORMAP_PINK', 'COLORMAP_PLASMA', 'COLORMAP_RAINBOW',
'COLORMAP_SPRING', 'COLORMAP_SUMMER', 'COLORMAP_TURBO',
'COLORMAP_TWILIGHT', 'COLORMAP_TWILIGHT_SHIFTED','COLORMAP_VIRIDIS',
'COLORMAP_WINTER']

2.官方方案展示

2.1读取图片

# 读取一张渐变图并转换为灰度图像
img = cv2.imread('D:\ColorMaptest.bmp')
gray_image = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

2.2效果展示

代码:

#创建一个figure来展示所有colormap的效果
import matplotlib.pyplot as plt
fig, axs = plt.subplots(len(colormaps) // 2 , 2, figsize=(32, 16))
fig.subplots_adjust(hspace=0.5, wspace=0.1)
for i, colormap in enumerate(colormaps):
    # 应用colormap到灰度图像
    colored_image = cv2.applyColorMap(gray_image, getattr(cv2, colormap))
    # 将OpenCV的BGR图像转换为matplotlib可以显示的RGB图像
    colored_image = cv2.cvtColor(colored_image, cv2.COLOR_BGR2RGB)
    # 获取当前的subplot位置
    ax = axs[i // 2, i % 2]
    # 显示图像和colormap的名字
    ax.imshow(colored_image)
    ax.set_title('opencv_colormap: ' + colormap)
    ax.axis('off')
plt.show()

效果如下:
在这里插入图片描述

三、Matplotlib中颜色预设方案

1.引入库并获取预设方案

代码如下:

import matplotlib.cm as cm
# 获取Matplotlib中所有预设的colormap名称
cmap_names = sorted(cm.datad.keys())
# 打印所有colormap的名称
print("Matplotlib预设的Colormap名称:")
for cmap_name in cmap_names:
    print(cmap_name)

结果(共有75种预设方案):
在这里插入图片描述

2.官方方案展示

2.1读取图片

# 读取一张渐变图并转换为灰度图像
img = cv2.imread('D:\ColorMaptest.bmp')
gray_image = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

2.2效果展示

代码:

#创建一个figure来展示所有colormap的效果
import matplotlib.pyplot as plt
fig, axs = plt.subplots(len(cmap_names) // 3 , 3, figsize=(20, 16))
fig.subplots_adjust(hspace=0.5, wspace=0.1)
for i, cmap_name in enumerate(cmap_names):
    # 获取当前的subplot位置
    ax = axs[i // 3, i % 3]
    ax.imshow(gray_image, cmap=cmap_name)
    # 显示图像和colormap的名字
    ax.set_title('花椒鱼不要鱼matplotlib_cmap: ' + cmap_name)
    ax.axis('off')
plt.show()

效果如下:
在这里插入图片描述

四、自定义颜色映射方案

1、OpenCV

根据自己期望的渐变方案中各颜色的RGB值自定义(自己设定渐变方案时,可使用PS软件的渐变工具、PPT中设置色块背景等方法实现快速的效果展示及调整)

import numpy as np
def create_custom_colormap():
    colors = [
        (4, 4, 37),
        (12, 28, 84),
        (7, 96, 149),
        (47,139,176),
        (171, 209, 223),
        (255, 255, 255),
    ]
    cmap = np.zeros((256, 1, 3), dtype=np.uint8)
    segments = np.linspace(0, 1, len(colors))
    for i in range(256):
        norm_i = i / 255.0
        idx = np.searchsorted(segments, norm_i) - 1
        if idx == len(colors) - 1:
            cmap[i] = colors[-1]
        else:
            d = (norm_i - segments[idx]) / (segments[idx + 1] - segments[idx])
            c = [int((1 - d) * colors[idx][j] + d * colors[idx + 1][j]) for j in range(3)]
            cmap[i] = c
    return cmap

引用自定义映射方案并展示结果
①使用Opecv读图并转换为灰度图

import cv2
img = cv2.imread('D:\T20240526092343.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

②使用自定义的方案

SMcmap = create_custom_colormap()
colorized = cv2.applyColorMap(gray, SMcmap)

③效果展示
在这里插入图片描述

④挑选3个OpenCV预设映射方案,效果如下:
在这里插入图片描述

2、Matplotlib

根据自己期望的渐变方案中各颜色的RGB值的16进制来自定义(渐变方案自定义同上Opencv中描述,或网页中有很多渐变颜色网站也可);
在Matplotlib中自定义颜色映射方案,代码量较OpenCV简洁;

import matplotlib.colors as mcolors
colors = ['#250404', '#541C0C',  '#956007', '#B08B2F', '#DFD1AB', '#FFFFFF']
SMcmap = mcolors.LinearSegmentedColormap.from_list('my_cmap', colors, N=256)

引用自定义映射方案并展示结果
①使用自定义的方案

plt.imshow(gray,cmap=SMcmap)

②效果展示(挑选了Matplotlib中的几种方案一起展示)
在这里插入图片描述
在这里插入图片描述


总结

以上就是今天所要分享的内容,本文分别例举了OpenCV和Matplotlib的Colormap预设方案并简单介绍了Python语言中使用两种方式实现自定义线性渐变颜色映射的方法。

  • 24
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 要在 Python 中使用自定义颜色来绘制 colorbar,您可以使用 Matplotlib 库中的 `matplotlib.pyplot.colormap` 函数来创建自定义颜色映射。然后,您可以使用 `matplotlib.pyplot.colorbar` 函数来绘制 colorbar,并将自定义颜色映射作为参数传递给该函数。 示例代码: ``` import matplotlib.pyplot as plt import numpy as np # Create data data = np.random.rand(10,10) # Create custom colormap cmap = plt.colormap(['blue', 'red']) # Create heatmap using custom colormap plt.imshow(data, cmap=cmap) # Add colorbar plt.colorbar() # Show plot plt.show() ``` 这段代码会生成一个热图,并使用自定义颜色映射(blue,red)作为颜色条。 ### 回答2: Python中的matplotlib库提供了许多绘图功能,其中包括绘制颜色条(colorbar)的功能。颜色条可以用于显示图像或其他可视化数据中的值,通常使用默认颜色来表示不同值的范围。但是,有时我们需要使用自定义颜色来表示不同值的范围,这时就需要在Python自定义颜色条。 下面是一些实现自定义颜色条的基本步骤: 1.确定颜色条的值范围 自定义颜色条需要确定颜色条所表示的值范围。可以利用numpy库中的linspace函数生成一个等距的数值数组,数组的范围应该等于颜色条所表示的数据范围。 2.创建自定义颜色映射Python中,要创建自定义颜色条,需要先创建一个自定义颜色映射(cmap)。可以使用 LinearSegmentedColormap() 函数创建一个基于颜色端点的颜色映射颜色映射对象具有一个名为 __call__ 的方法,该方法使用0-1之间的值将数据映射颜色映射中。 3.应用自定义颜色条 将自定义颜色条应用于绘图时,只需在plot、imshow或pcolor等函数中使用cmap参数来指定即可。 例如,可以使用以下代码创建一个从蓝色到红色的颜色条: ```python import numpy as np import matplotlib.pyplot as plt from matplotlib.colors import LinearSegmentedColormap #确定值范围 values = np.linspace(0, 1, 100) #创建自定义颜色映射 cmap = LinearSegmentedColormap.from_list('my_cmap', ['blue', 'red']) #应用颜色条 plt.imshow(values.reshape((10, 10)), cmap=cmap) plt.colorbar() plt.show() ``` 需要注意的是,自定义颜色条应该根据不同的数据来选择适当的颜色映射方式。例如,如果数据是对称的,可以使用 "RdBu" 颜色条,如果数据集只包含正值,则可以使用 "Reds" 颜色条。决定颜色条的方式应基于对数据集的理解,以便用户能够正确地解释颜色条所表示的含义。 ### 回答3: Python中,colorbar是一种常用的颜色图例,可以帮助用户更好地解释数据。在某些情况下,用户需要根据需要自定义颜色条。本文将介绍如何在Python自定义颜色条。 在Python中,可以使用matplotlib库来创建、显示和保存图表。要自定义颜色条,需要使用matplotlib.pyplot.colorbar()函数。该函数提供了许多参数,可用于控制颜色条的外观和属性。下面是一些可用的常见参数: - cmap:指定颜色条使用的颜色映射。可以是一个字符串(例如“viridis”),也可以是一个自定义的colormap对象。 - boundaries:定义颜色条的边界。如果您想要自己定义颜色条的颜色,可以使用boundaries参数。 - ticks:指定颜色条上的标记位置。 - orientation:指定颜色条的方向。可以是“vertical”或“horizontal”。 - label:指定颜色条的标签。 下面是一个简单的例子,利用cmap和bounds参数自定义一个颜色条: ``` import matplotlib.pyplot as plt import numpy as np x = np.linspace(0, 1, 50) y = np.linspace(0, 1, 50) X, Y = np.meshgrid(x, y) Z = X**2 + Y**2 fig, ax = plt.subplots() im = ax.imshow(Z, cmap='RdBu_r') bounds = np.array([0, 0.25, 0.5, 0.75, 1]) norm = plt.Normalize(bounds.min(), bounds.max()) colors = ["#DC143C", "#FFA07A", "#FFD700", "#9ACD32", "#228B22"] cmap = plt.cm.colors.ListedColormap(colors[1:-1]) cbar = ax.figure.colorbar(im, ax=ax, cmap=cmap, norm=norm, boundaries=bounds, ticks=bounds) cbar.ax.set_yticklabels(['0', '0.25', '0.5', '0.75', '1']) plt.show() ``` 在这个例子中,我们使用了RdBu_r颜色映射,但是通过colors参数我们改变了它的渐变蓝白红,设置四个断点。然后我们使用cmap和bounds参数在颜色条中指定自定义刻度。最后,我们将刻度设置为分别为0, 0.25, 0.5, 0.75, 1.。 总结一下,在Python自定义颜色条可以使用matplotlib.pyplot.colorbar()函数控制外观和属性。你可以使用cmap、boundaries、ticks、orientation和label等参数来设置颜色条的一些属性,以达到自定义颜色的目的。希望这个例子可以帮助你更好的掌握这些概念。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

花椒鱼不要鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值