Извлечение RGBA из карт Matplotlib - PullRequest
0 голосов
/ 04 октября 2019

Я пытаюсь преобразовать фигуру, созданную с помощью Matplotlib imshow, в значения RGBA, но я получил следующую ошибку:

ValueError: not enough values to unpack (expected 4, got 0)

Это мой код:

speed0 = speed[0, :, :].values   

figsize = (7, 7)
cbarkw = dict(shrink=0.6, extend='both')

fig, ax = plt.subplots(figsize=figsize)
i = plt.imshow(speed0, origin='lower')
cbar = plt.colorbar(i, **cbarkw)
plt.axis('off')

def matplotlib_to_opencv(i):
    image = i._rgbacache
    r, g, b, a = cv2.split(image)
    return np.flipud(cv2.merge([b, g, r, a]))

image = matplotlib_to_opencv(i)

Где скорость0является набором данных о ветре (192x111). Я думаю, что 'image' - это пустой кеш, и поэтому cv2.split не может его прочитать, но я не знаю, как заставить его работать должным образом. Идеи?

Заранее спасибо.

1 Ответ

1 голос
/ 04 октября 2019

Я думаю, что вы должны сделать, чтобы получить то, что вы хотите, это изменить вызов на make_image

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

speed = np.random.random((4, 192, 111))

speed0 = speed[0, :, :]

figsize = (7, 7)
cbarkw = dict(shrink=0.6, extend='both')

fig, ax = plt.subplots(figsize=figsize)
im = plt.imshow(speed0, origin='lower')

cbar = plt.colorbar(im, **cbarkw)
plt.axis('off')


def matplotlib_to_opencv(im):
    image = im.make_image('TkAgg')
    # this returns
    #         -------
    #         image : (M, N, 4) uint8 array
    #             The RGBA image, resampled unless *unsampled* is True.
    #         x, y : float
    #             The upper left corner where the image should be drawn, in pixel
    #             space.
    #         trans : Affine2D
    #             The affine transformation from image to pixel space.
    #         """
    # So you just want the first 
    r, g, b, a = cv2.split(image[0])
    return np.flipud(cv2.merge([b, g, r, a]))

image = matplotlib_to_opencv(im)


plt.show()

Поскольку у меня не было вашего набора данных, я не уверен на 100%, что вы хотели. Но я верю, что это должно сработать.

...