Конвертировать фигуру Matplotlib в массив NumPy без каких-либо границ / рамок или осей - PullRequest
4 голосов
/ 26 декабря 2011

Я пытаюсь сравнить сгенерированное изображение в Python с изображением / фотографией в файле.

Лучший способ сделать это до сих пор - сгенерировать фигуру в Matplotlib, а затем преобразовать ее в пустой массив и сравнить значения со значениями, полученными из моего изображения.

Я получил следующий код для преобразования фигуры Matplotlib в трехмерный массив с каналами RGB:

def fig2data ( fig ):
    """
    @brief Convert a Matplotlib figure to a 3D numpy array with RGB channels and return it
    @param fig a matplotlib figure
    @return a numpy 3D array of RGB values
    """
    # draw the renderer
    fig.canvas.draw ( )

    # Get the RGBA buffer from the figure
    w,h = fig.canvas.get_width_height()
    buf = numpy.fromstring ( fig.canvas.tostring_rgb(), dtype=numpy.uint8 )
    buf.shape = ( w, h, 3 )

    return buf

Одна из проблем, которую я пытаюсь выяснить до сих пор, заключается в том, что это преобразованное изображение не обрезается. Например, если я нарисую квадрат, занимающий весь холст, Matplotlib поместит эту рамку анодирования, которая преобразуется и смешивает все мои результаты.

Как получить только числовые значения - без рамки или оси - фигуры, которую я сделал?

Или даже лучше, , если есть гораздо более простой способ сравнить рисунок и изображение в NumPy / Matplotlib, о которых я не знаю, пожалуйста, дайте мне знать.

1 Ответ

0 голосов
/ 27 декабря 2011

Ну, это не совсем ответ на проблему с использованием Matplotlib, но я отказался от этой библиотеки для этой работы и просто использовал PIL.

Это довольно легко, хотя и довольно медленно (ноЯ не знаю, если это медленнее, чем Matplotlib).

Код следующий:

def makeImage (triangle, largura, altura):
    """
    triangle: receives a tuple in the form: x1, y1, x2, y2, x3, y3, R, G, B, A
    largura: image weight
    altura: image height

    returns: numPy array of the triangle composed final image
    """
    back = Image.new('RGBA', (largura,altura), (0,0,0,0))
    poly = Image.new('RGBA', (largura,altura))
    pdraw = ImageDraw.Draw(poly)

    pdraw.polygon([1,2,3,4,5,6], fill=(255,0,0,127))
    back.paste(poly,mask=poly)

    back = back.convert('RGB')
    backArr = asarray(back)
    #back.show()

    return backArr

Если вы знаете способ ускорить этот процесс, пожалуйста, сделайтедайте мне знать.

...