文章目录
前言
数据可视化的颜色映射方法在热成像、仿真模拟等诸多地方均有应用,但官方预设方案有时候和实际应用中想要的结果差异较大,常常需要自己设定想要的方案来实现;目前没有看到有人在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语言中使用两种方式实现自定义线性渐变颜色映射的方法。