在 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]]
我有一个色阶图像
我使用
过滤掉实际的色阶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]]