Seaborn需要几分钟才能从图像阵列中创建像素方差的热图



我正在使用seaborn热图来显示图像数组(从视频中获得(的像素方差,但这样做需要10多分钟,并且完全冻结了我的办公室PC。我正在寻找一种在没有所有这些问题的情况下获取此热图的方法。

我尝试删除ytick标签,因为我看到了一些可能会有所帮助的建议。

vidcap = cv2.VideoCapture('video2.mp4')
#vidcap.set(cv2.CAP_PROP_FPS, 5)
success,image = vidcap.read()
count = 0
images = []
while success:
  #cv2.imwrite("frame%d.png" % count, image)     # save frame as png file      
  success, image = vidcap.read()
  if success == True:
      images.append(cv2.cvtColor(image, cv2.COLOR_BGR2GRAY))
  print('New frame: ', success)
  count += 1
images = np.asarray(images)
aax = sns.heatmap(images.std(axis = 0), yticklabels = False)
plt.show()
我认为这不是

seaborn在这里花费时间,而是您将视频的所有帧加载到内存中。 你要确保你没有这样做!

基本上,您希望计算"运行"或在线方差,而不存储中间值。 有几种方法可以通过各种权衡来做到这一点,但我建议你看看Welford的算法,甚至在维基百科页面上有一个很好的Python实现。

你基本上需要更改你的代码来做:

success, image = vidcap.read()
image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
state = (1, np.array(image, dtype=float), np.zeros(image.shape))
while True:
    success, image = cap.read()
    if not success:
        break
    image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    state = update(state, image)
mu, var0, var1 = finalize(state)
image_sd = np.sqrt(var1)
sns.heatmap(image_sd)

updatefinalise来自维基百科页面

如果真的是seaborn导致事情变慢,那么我会使用 matplotlib 的imshow,因为它所做的工作要少得多,例如:

import matplotlib.pyplot as plt
plt.imshow(image_sd)