在视频异常检测中,对于实验结果的描述通常是有ROC曲线、PSNR曲线、真实视频帧与预测异常帧之间的误差热力图。之前的文章讲了自己制作ROC曲线,可以看这里把多个ROC曲线画在一张图上_weixin_44323744的博客-CSDN博客_多条roc曲线绘制在一张图https://blog.csdn.net/weixin_44323744/article/details/125488109?spm=1001.2014.3001.5502
这篇文章讲讲怎么画误差热力图,在文献中看到的都是这样子的效果:
![真实视频帧,误差热力图](https://img-blog.csdnimg.cn/28dc31b1cc4840f49a6ea83997a1e31c.png)
![](https://img-blog.csdnimg.cn/8956b741bf7d4949834d8bb5bc8d08fc.png)
所以,我们怎么制作呢?
1. 数据准备
首先需要有真实视频帧,模型生成的视频帧 。这两个数据是必须要有的。模型生成的视频帧可以保存为npy文件格式,自行转为numpy.array格式。
2. 代码
注意:在制作热力图是,必须把图像转为灰度,否则达不到背景蓝色,异常位置为突出颜色的效果。(大坑无踩!!!)
from PIL import Image
import numpy as np
import cv2
import numpy as np
import matplotlib.pyplot as plt
import matplotlib
from PIL import Image
from skimage import io, transform, color
# 1.读取gt图片,并转为灰度图像
rgbImg=cv2.imread('gt.png')
img_gt=cv2.cvtColor(rgbImg, cv2.COLOR_BGR2GRAY)
# 2.读取生成的图片,并转为灰度图像
rgb = io.imread('pred.png') # 读取图片
img_pred = color.rgb2gray(rgb)
# 3.开始进行制作误差热力图
A_img = img_gt
B_img = img_pred
#选取需要计算差值的两幅图片
dimg1 = A_img[:, :]
#归一化
dimg1_2 = np.zeros(dimg1.shape, dtype=np.float32)
cv2.normalize(dimg1, dimg1_2, alpha=0, beta=1, norm_type=cv2.NORM_MINMAX, dtype=cv2.CV_32F)
# 显示选取的图像
plt.figure()
plt.imshow(dimg1_2, cmap='gray')
plt.show()
dimg2 = B_img[:, :]
dimg2_2 = np.zeros(dimg2.shape, dtype=np.float32)
cv2.normalize(dimg2, dimg2_2, alpha=0, beta=1, norm_type=cv2.NORM_MINMAX, dtype=cv2.CV_32F)
plt.figure()
plt.imshow(dimg2_2,cmap='gray')
plt.show()
d = abs(dimg1_2-dimg2_2)*1
fig = plt.figure(dpi=200)
plt.figure(num=1)
cnorm = matplotlib.colors.Normalize(vmin=0, vmax=1)
m = matplotlib.cm.ScalarMappable(norm=cnorm, cmap=matplotlib.cm.jet)
m.set_array(d)
plt.imshow(d, norm=cnorm, cmap="jet")
plt.axis("off")
plt.colorbar(m)
plt.gca().xaxis.set_major_locator(plt.NullLocator())
plt.gca().yaxis.set_major_locator(plt.NullLocator())
plt.subplots_adjust(top=1, bottom=0, left=0, right=1, hspace=0, wspace=0)
plt.margins(0, 0)
plt.savefig('test.png' , bbox_inches='tight', dpi=400,pad_inches=0)
3. 模型生成的图像数据保存为npy格式
把模型生成的图像数据保存为npy格式的解决方法,后续更新。但是方法不变,把两个对比的图像数据转为numpy.array即可。
参考:(4条消息) (8)Python计算并显示差值图像_qq_42392677的博客-CSDN博客_python图像差值