问题描述
我正在使用以下代码查找信号的频谱图并保存。
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)
但我有多个这样的频谱图,我需要的最终产品是所有这些的串联。现在,我正在做的是,我像之前一样使用 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: