Я пытаюсь добавить изображение 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. Заранее спасибо!