使用 openCV 处理 matplotlib.figure.Figure

问题描述

我正在使用以下代码查找信号的频谱图并保存。

spec,freq,t,im = plt.specgram(raw_signal,Fs=100,nfft=100,noverlap=50)
plt.axis('off')
figure = plt.gcf()
figure.set_size_inches(12,1)
plt.savefig('spectrogram',bBox_inches = 'tight',pad_inches=0)

enter image description here

我有多个这样的频谱图,我需要的最终产品是所有这些的串联。现在,我正在做的是,我像之前一样使用 plt.savefig() 保存所有这些单独的图像,然后使用 cv2.imread() 读取它们并将它们连接起来。但是这个过程我觉得不是很好。那么有没有其他方法可以做到这一点而无需保存并重新阅读它?

我有一个可能的想法是,以某种方式将 matplotlib.figure.figure 转换为 OpenCV(特别是 cv2)可以处理的格式。但是,它也不应该有白色填充。

解决方法

您可以使用 buffer_rgba 将图像作为数组获取(不要忘记先 draw 图像)。然后在 OpenCV 中,需要将图像从 RGB 转换为 OpenCV 的 BGR 通道排序。

import matplotlib.pyplot as plt
import numpy as np
import cv2

raw_signal =  np.random.random(1000)
spec,freq,t,im = plt.specgram(raw_signal,Fs=100,NFFT=100,noverlap=50)
plt.axis('off')
figure = plt.gcf()
figure.set_size_inches(12,1)
figure.set_dpi(50)

figure.canvas.draw()

b = figure.axes[0].get_window_extent()
img = np.array(figure.canvas.buffer_rgba())
img = img[int(b.y0):int(b.y1),int(b.x0):int(b.x1),:]
img = cv2.cvtColor(img,cv2.COLOR_RGBA2BGRA)
cv2.imshow('OpenCV',img)

顶部:matplotlib,底部 OpenCV:

enter image description here