Loading

HSV实现热力图标尺统一

背景

生成的热力图的标尺不匹配,需要重新映射其标尺

例如,在下面的图片中,每个图片的标尺都不一样

image

HSV色彩空间

HSV色彩空间是一种将颜色描述为色相、饱和度和亮度三个参数的颜色模型。HSV代表了Hue(色相)、Saturation(饱和度)和Value(亮度)三个英文单词的缩写。

在HSV色彩空间中,色相表示色彩的种类,饱和度表示颜色的纯度,亮度表示颜色的亮度程度。其中,色相是一个以360度为周期的角度值,可以理解为一个颜色在色轮上的位置。饱和度表示颜色与灰色的混合程度,取值范围为0-1之间,0表示完全灰色,1表示纯彩色。亮度表示颜色的明暗程度,取值范围为0-1之间,0表示完全黑色,1表示最亮的颜色。

热力图通常是用于表示数据的分布情况,其中颜色类型表示数据的密度或强度。由于热力图间的色彩对于数据的映射不一致,因此需要对颜色进行拉伸,以便更好地显示数据的差异性。而使用HSV色彩空间进行颜色拉伸,通过调整其hue的范围来进行。

热力图的标尺色相变化的范围是 240(蓝色)-0(红色),我们通过变化(0-240)色相范围内的值,就可以实现在不改变其他颜色的基础上,实现标尺的放缩

解决方案

大致流程如下图所示

image

代码

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的范围

效果

image

在调整前,相同颜色对应的数据不同,调整后达到统一。

posted @ 2023-02-25 19:30  笑云博文  阅读(271)  评论(0)    收藏  举报