Отображение изображения с помощью matplotlib с разрешением, превышающим разрешение экрана

Я пытаюсь отобразить спутниковое изображение Sentinel-1 размером 26000 (ширина) X 17000 (высота) пикселей и использовать Python 3.5. Я могу загрузить это изображение в numpy в виде массива и пытаюсь отобразить в matplotlib, но не могу этого сделать, так как это дает ошибку памяти. Разрешение экрана 1600 (ширина) X 1200 (высота) пикселей. Я использую Windows 7 с 8 ГБ ОЗУ. Я согласен с тем, что он может не отображаться из-за нехватки памяти, но есть ли способ отобразить такое огромное изображение? Также я видел много программ для обработки спутниковых изображений, таких как SNAP (Sentinel Toolbox), которые могут отображать такие огромные изображения в указанном выше разрешении экрана, но не могу найти, как они это делают. Пожалуйста, помогите.


person Shubham_geo    schedule 24.09.2018    source источник
comment
Вопрос немного в том, для чего вам нужно такое большое изображение внутри сюжета matplotlib. Если это для отображения на экране, вероятно, не имеет смысла отображать изображение с разрешением 26000 пикселей на экране с разрешением 2000 пикселей, поскольку в любом случае может отображаться только каждый 13-й пиксель.   -  person ImportanceOfBeingErnest    schedule 24.09.2018
comment
@ ImportanceOfBeingErnest : Можно ли как-то масштабировать, как я видел в наборе инструментов Sentinel-1 (SNAP), в нем может отображаться все изображение, даже если оно не соответствует разрешению экрана. Но интересно, как это делается?   -  person Shubham_geo    schedule 24.09.2018
comment
Matplot автоматически масштабирует изображение, чтобы оно соответствовало осям. Моя точка зрения заключалась в том, что вам не нужно указывать 13 * 13 = 169 значений цвета для одного пикселя на экране.   -  person ImportanceOfBeingErnest    schedule 24.09.2018
comment
@ ImportanceOfBeingErnest: я просто хочу отобразить изображение в градациях серого ... возможно, любой выход, по вашему мнению.   -  person Shubham_geo    schedule 24.09.2018
comment
Уменьшите массив 26000x17000 до массива 2000x1307. Постройте этот уменьшенный массив.   -  person ImportanceOfBeingErnest    schedule 24.09.2018
comment
Хорошо, попробую это масштабирование.   -  person Shubham_geo    schedule 24.09.2018


Ответы (1)


Пытался создать изображение с указанной вами шириной и высотой. У меня разрешение экрана 1920 на 1080, FHD

import matplotlib
matplotlib.rcParams['figure.dpi'] = 120
import matplotlib.pyplot as plt
import numpy as np
from matplotlib import cm
from numpy.random import randn
fig, ax = plt.subplots()
data = np.clip(randn(26000, 17000), -1, 1)
cax = ax.imshow(data, interpolation='nearest', cmap=cm.coolwarm)

cbar = fig.colorbar(cax, ticks=[-1, 0, 1])
cbar.ax.set_yticklabels(['< -1', '0', '> 1'])  

plt.show()

Сюжет генерируется, но питон съедает около 7 ГБ памяти!

введите здесь описание изображения введите здесь описание изображения

person Khalil Al Hooti    schedule 24.09.2018
comment
Я полагаю, что под изображением OP означает что-то вроде rand(17000,26000,3), что наверняка потребует гораздо больше памяти. - person ImportanceOfBeingErnest; 24.09.2018
comment
@Khalil Al Hooti Я попробовал ваш брат по коду, но все равно та же ошибка памяти. Я не могу отобразить даже ваше изображение. Пожалуйста, предложите любой лучший вариант. - person Shubham_geo; 24.09.2018
comment
@Shubham_geo Я предлагаю вам уменьшить объем данных, взяв каждое 3-е или 4-е значение в каждом направлении. например, в приведенном выше коде вы можете попытаться сделать data = data[::3, ::3] и принять во внимание предложение @ImportanceOfBeingErnest. Сюжет не будет сгенерирован как есть, так как массив 2d numpy занимает огромный кусок памяти за пределами оперативной памяти вашего компьютера! мой компьютер имеет 32 гб оперативной памяти - person Khalil Al Hooti; 24.09.2018