Как построить 1 пиксель на образец для изображения? / В каком направлении измеряется DPI? - PullRequest
1 голос
/ 21 июня 2019

У меня есть двумерный массив значений в грубых измерениях (65000x256). Мне нужно построить эти данные для изображения, которое имеет ровно один пиксель для каждого значения.

def save_image_data(data, cm, fn):
#Source https://fengl.org /2014/07/09/matplotlib-savefig-without-borderframe/   
    sizes = np.shape(data)
    height = float(sizes[0])
    width = float(sizes[1])

    fig = plt.figure()
    fig.set_size_inches(width/height, 1, forward=False)
    ax = plt.Axes(fig, [0., 0., 1., 1.])
    ax.set_axis_off()
    fig.add_axes(ax)

    ax.imshow(data, cmap=cm)
    plt.pause(1)
    plt.savefig(fn, dpi = height, transparent=False) 

    plt.close()

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

пример изображения

Ответы [ 2 ]

1 голос
/ 21 июня 2019

Если единственной целью использования matplotlib здесь является получение цветовой карты в массиве, проще всего использовать plt.imsave.

import numpy as np
import matplotlib.pyplot as plt

data = np.random.rand(256,65000)

plt.imsave("output.png", data, cmap="viridis")

. Это создает изображение в формате png с точными размерами в пикселяхмассив.

Если изображение должно содержать другие графические элементы, созданные с помощью matplotlib, оно становится намного сложнее.( Я был бы рад дополнить этот ответ другими вариантами, но только при необходимости, поэтому лучше оставить комментарий в этом случае. )

0 голосов
/ 21 июня 2019

Мне пришлось построить 2d массив на днях.Следующее работало для меня:

my_img = # 2d array

plt.figure(figsize=(19,19))
plt.imshow(my_img, cmap='gray_r', vmin=my_img.min(), vmax=my_img.max())

plt.title('Title')

plt.savefig(path)
plt.show();

РЕДАКТИРОВАТЬ: Связанные пиксели: от документы :

аспект: {'равно', 'авто'}или float, опционально Управляет соотношением сторон осей.Этот аспект имеет особое значение для изображений, поскольку он может искажать изображение, т. Е. Пиксель не будет квадратным.

Этот параметр является ярлыком для явного вызова Axes.set_aspect.См. Там для получения дополнительной информации.

'равно': Гарантирует, что соотношение сторон равно 1. Пиксели будут квадратными (если только размеры пикселей явно не являются квадратными в координатах данных с использованием экстента).'auto': оси остаются фиксированными, а аспект регулируется таким образом, чтобы данные помещались по осям.Как правило, это приведет к не квадратным пикселям.Если не указано, используйте rcParams ["image.aspect"] (по умолчанию: 'равно').

РЕДАКТИРОВАТЬ 2: Хотя я предоставил решение для построения 2-мерного массива с квадратными пикселями, то есть без искажений,это правда, что я не учел реальный размер пикселей.Я нашел два ответа на SO, которые уже решают эту проблему, и я думаю, что они могут вам помочь:

Надеюсь, это поможет!

...