Обработка matplotlib.figure.Figure с использованием openCV

Я использую следующий код, чтобы найти спектрограмму сигнала и сохранить ее.

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). Однако он также не должен иметь белой набивки.

Применение градиента к изображению с помощью CSS
Применение градиента к изображению с помощью CSS
Здравствуйте, братья и сестры, как дела? Недавно я застрял на применении градиента к изображению. Я применял это много раз, но иногда наши требования...
Получение URL-адреса изображения курса в Moodle с помощью PHP
Получение URL-адреса изображения курса в Moodle с помощью PHP
Moodle - это популярная система управления обучением с открытым исходным кодом, используемая многими учебными заведениями и организациями по всему...
1
0
1 176
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы можете получить изображение в виде массива, используя 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:

Спасибо, похоже, это сработает. Дай мне попробовать

user12397996 27.12.2020 06:46

Спасибо, это почти работает. Но я все еще не могу контролировать белый/прозрачный фон вокруг него. Есть ли что-нибудь эквивалентное bbox_inches = 'tight',pad_inches=0 из savefig?

user12397996 27.12.2020 07:01

Кроме того, я хотел бы знать, есть ли способ контролировать dpi?

user12397996 27.12.2020 07:02

пожалуйста, посмотрите мой обновленный ответ: вы можете установить dpi, и мы сохраним только объект осей, а не всю фигуру

Stef 27.12.2020 08:19

не сохраняйте фигуру. У matplotlib есть удобная функция для отображения данных временных рядов таким образом, но это не то, как вы работаете со спектрограммами. любая обработка "изображений" спектрограммы - кладж.

используйте scipy.signal.spectrogram, чтобы получить актуальную спектрограмму.

Но таким образом я не смогу управлять белым отступом. На данный момент я делаю это во время savefig(). И как это сделать для нескольких спектрограмм и соединить их все, если я не работаю с ними как с картинками?

user12397996 27.12.2020 06:46

Другие вопросы по теме