Добавление изображения TIFF в качестве фона к 3D-графикам - PullRequest
0 голосов
/ 18 июня 2020

Я пытаюсь добавить изображение TIFF в качестве фона к 3D-графику. Этот топи c был описан здесь раньше и работал у меня, но только для файлов png. Однако я хочу воспроизвести тот же результат с изображением в формате TIFF.

Вот код, который работает для файлов .png:

from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm
from matplotlib.ticker import LinearLocator, FormatStrFormatter
import matplotlib.pyplot as plt
import numpy as np
from matplotlib._png import read_png
from matplotlib.cbook import get_sample_data

fig = plt.figure(figsize=(15,15))
ax = fig.gca(projection='3d')
X = np.arange(-5, 5, .25)
Y = np.arange(-5, 5, .25)
X, Y = np.meshgrid(X, Y)
R = np.sqrt(X**2 + Y**2)
Z = np.sin(R)
surf = ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=cm.winter,
                       linewidth=0, antialiased=True)

ax.set_zlim(-2.01, 1.01)
ax.zaxis.set_major_locator(LinearLocator(10))
ax.zaxis.set_major_formatter(FormatStrFormatter('%.02f'))

arr = read_png('test_duna_2.png')

height, width = arr.shape[:2]
stepX, stepY = 10.0/width, 10.0/height

X1 = np.arange(-5, 5, stepX)
Y1 = np.arange(-5, 5, stepY)
X1, Y1 = np.meshgrid(X1, Y1)
# stride args allows to determine image quality 
# stride = 1 work slow
#ax.plot_surface(X1, Y1, np.atleast_2d(-2.01), rstride=1, cstride=1, facecolors=arr)
ax.plot_surface(X1, Y1, np.atleast_2d(-2.0), rstride=10, cstride=10, facecolors=arr)

plt.show()

Вывод изображения

Я заметил, что код работает одинаково хорошо, когда Меняю read_png на plt.imread в arr = read_png('test_duna_2.png'). Однако ax.plot_surface, похоже, не работает, когда я пытаюсь загрузить файл tiff с plt.imread. Просто выскакивает ошибка: ValueError: Invalid RGBA argument: 116. Я пытался сделать то же самое с skimage, но ошибка все та же.

Есть какое-нибудь решение или обход этой проблемы? Я хотел бы в будущем распространить это на стеки tiff. Заранее спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...