gpt4 book ai didi

python - 如何在 Python 中将图像正确显示为具有步进转换的 3D 图?

转载 作者:行者123 更新时间:2023-11-28 17:00:56 31 4
gpt4 key购买 nike

我正在尝试可视化 3D 图像之间的差异,以便更轻松地区分正面和负面差异。

我已经成功绘制了图像的基本图,但是,在值之间 matplotlib 是插值。我需要这些是像素之间的步进变化。

我经常使用非常低分辨率的图像进行测试,例如 16 x 16,因此插值效果很大。

16 x 16 图像的 Numpy 文件: https://wetransfer.com/downloads/c916f76e0d86a61c00c2ed4cfe4ae97520190210192200/60d87c

解决这个问题的一种方法是重复这些值,但是,这似乎效率很低,需要在之后清理刻度。

enter image description here

生成上图的代码:

import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D

SubIm = np.load("Subtract_Image.npy")

def ImPlot2D3D(img, cmap=plt.cm.jet):

Z = img[::1, ::1]

fig = plt.figure(figsize=(14, 7))

# 2D Plot
ax1 = fig.add_subplot(1, 2, 1)
im = ax1.imshow(Z, cmap=cmap)
ax1.set_title('2D')
ax1.grid(False)

# 3D Plot
ax2 = fig.add_subplot(1, 2, 2, projection='3d')
X, Y = np.mgrid[:Z.shape[0], :Z.shape[1]]
ax2.plot_surface(X, Y, Z, cmap=cmap)
ax2.set_title('3D')

plt.show()


ImPlot2D3D(SubIm)

我研究过 3D 条形图,但它们都使用分箱方案,我无法让它适用于图像。

最佳答案

最终设法回答了我自己的问题。

解决此问题的一种蛮力方法是重复数组中的值,从而使“matplotlib”所做的值之间的插值影响较小,并能更好地逼近阶跃变化。这可以使用 numpy.repeat 来实现.由于这是一个 3D 数组,我们必须在一个轴上迭代而不是另一个轴。否则,数组将被重复展平并返回这个平面数组。

结果: Results:

def ImPlot2D3D(img, cmap=plt.cm.jet, step=False, ratio=10):

if step:
img = (img.repeat(ratio, axis=0)).repeat(ratio, axis=1)

Z = img[::1, ::1]

fig = plt.figure(figsize=(14, 7))

# 2D Plot
ax1 = fig.add_subplot(1, 2, 1)
im = ax1.imshow(Z, cmap=cmap)
ax1.set_title('2D')
ax1.grid(False)

# 3D Plot
ax2 = fig.add_subplot(1, 2, 2, projection='3d')
X, Y = np.mgrid[:Z.shape[0], :Z.shape[1]]
ax2.plot_surface(X, Y, Z, cmap=cmap)
ax2.set_title('3D')

# Scale the ticks back down to original values
if step:
ticks_x = ticker.FuncFormatter(lambda x, pos: '{0:g}'.format(x / ratio))
ticks_y = ticker.FuncFormatter(lambda y, pos: '{0:g}'.format(y / ratio))
ax1.xaxis.set_major_formatter(ticks_x)
ax1.yaxis.set_major_formatter(ticks_y)
ax2.xaxis.set_major_formatter(ticks_x)
ax2.yaxis.set_major_formatter(ticks_y)

plt.show()

import matplotlib.ticker as ticker
import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D

SubIm = np.load("Subtract_Image.npy")
ImPlot2D3D(SubIm, step=True)

关于python - 如何在 Python 中将图像正确显示为具有步进转换的 3D 图?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54617316/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com