【python】热力图绘制: intensity_heatmap,density_heatmap

部署运行你感兴趣的模型镜像

在使用深度学习时,尤其生成模型,我们想知道生成误差或者重构误差出现在什么地方,这时我们就需要用热力图来可视化。在可视化中,除了要显示损失的heatmap以外,我们还要与原始图像进行一个加权,使我们清楚地看到重构误差损失出现在什么位置。

本文提供两个函数解决这个问题:intensity_heatmap和density_heatmap

  • intensity_heatmap:损失强度热力图。像素值的亮暗显示损失的强与弱。

  • density_heatmap:损失密度热力图。只统计损失强度超过一定阈值的点,并且按阈值二值化。然后对这些强损失点添加半径,可视化强损失点的密度。

代码如下:

首先,需要安装三个函数包 cv2,PIL,pyheatmap,其中pyheatmap的安装如下:

pip install pyheatmap
# conda install pyheatmap  会报错,conda中不存在这个程序包

热力图的定义,使用代码如下:

import cv2
from PIL import Image
from pyheatmap.heatmap import HeatMap

def intensity_heatmap(background_img, intensity_map, blue_mask_weight=0.3, heat_map_weight=0.5):
	"""
	
	:param background_img: 背景图
	:param intensity_map: 损失强度图
	:param blue_mask_weight: 
	:param heat_map_weight: 
	:return: 
	"""
	assert background_img.ndim == 3
	assert intensity_map.ndim == 2 or intensity_map.ndim == 3
	assert background_img.shape[0:2] == intensity_map.shape[0:2]
	background_img_norm = ((background_img - background_img.min()) / (background_img.max() - background_img.min())
	                       * 255).astype(np.uint8)
	intensity_map_norm = ((intensity_map - intensity_map.min()) / (intensity_map.max() - intensity_map.min())
	                      * 255).astype(np.uint8)
	
	# 背景图需要加一个蓝色掩码,以更好的显示热力图
	blue_mask = cv2.rectangle(background_img.copy(), (0, 0), background_img.shape[0:2], (0, 0, 255), -1).astype(np.uint8)
	heatmap_base = cv2.addWeighted(blue_mask, blue_mask_weight, background_img_norm, 1 - blue_mask_weight, 0).astype(np.uint8)
	
	# 获取热力图
	hotmap_blue = np.array(cv2.applyColorMap(intensity_map_norm, cv2.COLORMAP_HOT))  # 是蓝色的3通道heatmap
	hotmap_red = cv2.cvtColor(hotmap_blue, cv2.COLOR_RGB2BGR)  # 由蓝色heatmap转为红色heatmap
	
	intensity_hotmap_img = cv2.addWeighted(hotmap_red, heat_map_weight, heatmap_base, 1 - heat_map_weight, 0)
	
	return intensity_hotmap_img

def density_heatmap(background_img, intensity_map, intensity_thr=50, density_radius=5, heat_map_weight=0.5):
	"""
	
	:param background_img: 背景图
	:param intensity_map: 损失map
	:param intensity_thr: 强损失阈值
	:param density_radius: 密度半径
	:param heat_map_weight: 
	:return: 
	"""
	assert background_img.ndim == 3
	assert intensity_map.ndim == 2 or intensity_map.ndim == 3
	assert background_img.shape[0:2] == intensity_map.shape[0:2]
	background_img_norm = ((background_img - background_img.min()) / (background_img.max() - background_img.min())
	                       * 255).astype(np.uint8)
	intensity_map_norm = ((intensity_map - intensity_map.min()) / (intensity_map.max() - intensity_map.min())
	                      * 255).astype(np.uint8)
	hotmap_points = []
	for i in range(intensity_map.shape[0]):  ##获取异常点
		for j in range(intensity_map.shape[1]):
			if intensity_map_norm[i, j] > intensity_thr:
				hotmap_points.append([j, i])
	
	background = Image.new("RGB", (intensity_map.shape[1], intensity_map.shape[0]), color=0)  ## heatmap基底
	hm = HeatMap(hotmap_points)
	density_heatmap_img = np.array(hm.heatmap(base=background, r=density_radius))
	density_heatmap_img = cv2.addWeighted(density_heatmap_img, heat_map_weight, background_img_norm,
	                                      1 - heat_map_weight, 0)
	
	return density_heatmap_img

if __name__ == "__main__":
    img_path = "gt_img.jpg" 
    loss_map_path = "loss_map.npy" 
    
    gt_img = cv2.imread(img_path) # shape = [h,w,c]
    loss_map = np.load(loss_map_path) # shape = [h,w,1] 或 shape = [h,w]
    
    density_heatmap_img = density_heatmap(gt_img,loss_map,intensity_thr=50,density_radius=10,heat_map_weight=0.5)
    intensity_hotmap_img = intensity_heatmap(gt_img,loss_map,blue_mask_weight = 0.1,heat_map_weight = 0.6)
    
    plt.subplot(121)
    plt.imshow(density_heatmap_img)
    plt.subplot(122)
    plt.imshow(intensity_hotmap_img)
    plt.show()

以下使用示例引用自:https://blog.youkuaiyun.com/weixin_43289135/article/details/104651047 

# -*- coding: utf-8 -*-
from pyheatmap.heatmap import HeatMap
import numpy as np
x = [10,20,30,80,50,40,70,90,60,30,40,50]
y = [50,40,20,30,60,90,60,20,60,10,70,50]
data = []
for i in range(0,11):
    temperature = [int(x[i]), int(y[i]),1]# 设置每个像素点处的温度
    data.append(temperature)
heat = HeatMap(data)
heat.clickmap(save_as="1.png") #点击图
heat.heatmap(save_as="2.png") #热图

您可能感兴趣的与本文相关的镜像

Python3.10

Python3.10

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

### 如何使用 Python 绘制 3D 热力Python绘制 3D 热力通常需要结合 `matplotlib` 和 `numpy` 库。以下是一个完整的示例代码,展示如何通过加载数据集并使用 `scatter` 方法来创建一个 3D 热力[^1]。 ```python import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D # 创建示例数据 x = np.random.rand(50) y = np.random.rand(50) z = np.random.rand(50) colors = np.random.rand(50) # 创建形对象 fig = plt.figure(figsize=(8, 5)) ax = fig.add_subplot(111, projection='3d') # 绘制散点 sc = ax.scatter(x, y, z, c=colors, cmap='viridis', marker='s') # 添加颜色条 color_bar = fig.colorbar(sc) color_bar.set_label('Color Intensity') # 设置坐标轴标签 ax.set_xlabel('X Label') ax.set_ylabel('Y Label') ax.set_zlabel('Z Label') # 设置标题 ax.set_title('3D Heatmap Example') # 显示形 plt.show() ``` 上述代码中,`scatter` 方法用于绘制 3D 散点,并通过 `cmap` 参数指定颜色映射方案[^1]。此外,还可以通过调整 `marker` 参数改变数据点的形状。 如果需要绘制 3D 条形而非散点,则可以使用 `bar3d` 方法[^2]。以下是一个简单的示例: ```python import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D # 创建示例数据 x = np.arange(4) y = np.arange(5) x, y = np.meshgrid(x, y) z = np.zeros(x.shape) dx = dy = 0.5 * np.ones_like(z) dz = np.random.rand(5, 4) # 创建形对象 fig = plt.figure() ax = fig.add_subplot(111, projection='3d') # 绘制3D条形 ax.bar3d(x.ravel(), y.ravel(), z.ravel(), dx.ravel(), dy.ravel(), dz.ravel(), color='aqua') # 设置坐标轴标签 ax.set_xlabel('X axis') ax.set_ylabel('Y axis') ax.set_zlabel('Z axis') # 显示形 plt.show() ``` 此代码展示了如何使用 `bar3d` 方法创建三维条形,并通过 `ravel()` 函数将二维数组展平为一维数组以适配方法参数[^2]。 对于更复杂的热力需求,例如结合表面和等高线,可以参考以下示例[^3]: ```python import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D # 创建示例数据 x = np.linspace(-5, 5, 50) y = np.linspace(-5, 5, 50) x, y = np.meshgrid(x, y) z = np.sin(np.sqrt(x**2 + y**2)) # 创建形对象 fig = plt.figure() ax = fig.add_subplot(111, projection='3d') # 绘制表面 surf = ax.plot_surface(x, y, z, cmap='coolwarm') # 添加颜色条 color_bar = fig.colorbar(surf) color_bar.set_label('Height') # 绘制等高线 contour = ax.contour(x, y, z, zdir='z', offset=-2, cmap='coolwarm') # 设置坐标轴范围和标签 ax.set_zlim(-2, 2) ax.set_xlabel('X axis') ax.set_ylabel('Y axis') ax.set_zlabel('Z axis') # 显示形 plt.show() ``` 这段代码展示了如何结合表面和等高线来增强热力的可视化效果。 ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值