我正在使用下面的代码找到一个信号的谱图并保存它。
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)处理的格式。但是,它也不应该有白色的填充。
发布于 2020-12-26 17:45:22
您可以使用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:
发布于 2020-12-27 00:21:32
不要保存这个数字。matplotlib碰巧有一个以这种方式显示时间序列数据的方便函数,但这不是处理光谱图的方法。任何对谱图“图片”的处理都是一种假象。
使用scipy.signal.spectrogram
获取实际的谱图。
https://stackoverflow.com/questions/65457097
复制相似问题