HSV实现热力图标尺统一
背景
生成的热力图的标尺不匹配,需要重新映射其标尺
例如,在下面的图片中,每个图片的标尺都不一样

HSV色彩空间
HSV色彩空间是一种将颜色描述为色相、饱和度和亮度三个参数的颜色模型。HSV代表了Hue(色相)、Saturation(饱和度)和Value(亮度)三个英文单词的缩写。
在HSV色彩空间中,色相表示色彩的种类,饱和度表示颜色的纯度,亮度表示颜色的亮度程度。其中,色相是一个以360度为周期的角度值,可以理解为一个颜色在色轮上的位置。饱和度表示颜色与灰色的混合程度,取值范围为0-1之间,0表示完全灰色,1表示纯彩色。亮度表示颜色的明暗程度,取值范围为0-1之间,0表示完全黑色,1表示最亮的颜色。
热力图通常是用于表示数据的分布情况,其中颜色类型表示数据的密度或强度。由于热力图间的色彩对于数据的映射不一致,因此需要对颜色进行拉伸,以便更好地显示数据的差异性。而使用HSV色彩空间进行颜色拉伸,通过调整其hue的范围来进行。
热力图的标尺色相变化的范围是 240(蓝色)-0(红色),我们通过变化(0-240)色相范围内的值,就可以实现在不改变其他颜色的基础上,实现标尺的放缩
解决方案
大致流程如下图所示

代码
import cv2
import numpy as np
def color2value(color, min, max):
value = (240 * max - (max - min) * color) / 240
return value
def value2color(value, min, max):
color = (240* value) / (min - max) + (240 * max) / (max - min)
return color
def convert_hue(color, standard_max, standard_min, max, min):
value = color2value(color, min, max)
colors = value2color(value, standard_min, standard_max)
#print(colors)
return colors
def convert(pic, standard_max, standard_min, max, min):
# 读取图片
img = cv2.imread(pic)
# 转换色彩空间为HSV
hsv_img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
# 转换hue值在0到240之间的数值
hsv_img[:, :, 0] = hsv_img[:, :, 0] * 2
hsv_img[:, :, 0] = np.where(hsv_img[:, :, 0] <= 240, convert_hue(hsv_img[:, :, 0], standard_max, standard_min, max, min), hsv_img[:, :, 0])
hsv_img[:, :, 0] = hsv_img[:, :, 0] / 2
# 将hue值超过360的部分取模
#hsv_img[:, :, 0] = hsv_img[:, :, 0] % 360
# 转换回BGR色彩空间
bgr_img = cv2.cvtColor(hsv_img, cv2.COLOR_HSV2BGR)
file_name = pic.split('.')[0]
cv2.imwrite(file_name+'_convert.jpg', bgr_img)
convert('Fig-color\\Figure12-260pa-top\\D.jpg', 321.8, 290, 307.625, 293)
注意,由于默认使用八位色彩格式(0-255),而色相为360度,因此在opencv的处理将rgb转化成hsv时,自动将真正的h值 /2 ,因此,我们在处理前,将h值 * 2 再进行处理,处理完毕时再转化成rgb时,还需将h值 / 2,还原成0-180的范围
效果

在调整前,相同颜色对应的数据不同,调整后达到统一。
很喜欢听到一个老师说的“半年理论”,现在做出的努力,一般要在半年的沉淀之后,才能出结果,所以在遇到瓶颈之时,不妨再努力半年

浙公网安备 33010602011771号