在 matplotlib 中基于色标重新创建颜色图

Recreate colormap based on colorscale in matplotlib

我有一个色阶图像

我使用

过滤掉实际的色阶
import cv2
import numpy as np

colorbar = cv2.imread('colorbar-scheme-elevation.png', cv2.IMREAD_UNCHANGED)
colorbar = cv2.cvtColor(colorbar, cv2.COLOR_BGRA2BGR)

hsv = cv2.cvtColor(colorbar, cv2.COLOR_RGB2HSV)
lower_gray = np.array([0, 0, 0])
upper_gray = np.array([255, 10, 255])

mask = cv2.inRange(hsv, lower_gray, upper_gray)
mask = cv2.bitwise_not(mask)
res = cv2.bitwise_and(colorbar, colorbar, mask=mask)
gray = cv2.cvtColor(res, cv2.COLOR_RGB2GRAY)


ret, thresh = cv2.threshold(gray, 10, 255, 0)
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
c = max(contours, key=cv2.contourArea)
x, y, w, h = cv2.boundingRect(c)

ROI = colorbar[y:y + h, x:x + w]

最终结果如下:

接下来,我只需要一行

ROI = ROI[0]

可以使用

找到所有独特的颜色
unique_colors = list(reversed(np.unique(ROI, axis=0)))

如何使用独特的颜色值重新创建色标?

您可以使用 ListedColormap 从颜色列表开始创建 Matplotlib 颜色图(请注意,我没有考虑您的最后两个命令):

from matplotlib.colors import ListedColormap
cmap = ListedColormap(ROI[0].astype(float) / 255)

您可以创建一行 ROI:

single_row_ROI = ROI[0:1,:]

所有独特的颜色都可以放在一个列表中:

colormap_list = single_row_ROI[0].tolist()

包含前 10 种颜色的列表:

>>> colormap_list[:10]
[[238, 135, 123], [237, 135, 123], [238, 136, 123], [238, 135, 123], [238, 135, 123], [237, 136, 123], [237, 135, 123], [237, 135, 123], [237, 136, 123], [237, 136, 123]]