首页 > 解决方案 > 在 Python 中从多个图像中绘制 3D 数据

问题描述

我正在尝试创建一个堆叠多个图像的 3D 矩阵,以创建密度的 3D 可视化,以便插入这些数据和其他操作......现在我正在尝试使用以下代码堆叠图像:

import numpy as np
import matplotlib.pyplot as plt



stacked = np.ndarray(shape=(300,300,20))
for s in range(11):
    s=s+1
    source = cv2.imread('IMAGE_#'+ str(s) +'.png',0)
    m = np.asmatrix(source)
    stacked[:,:,s]=m

x=stacked[:,0]
y=stacked[:,1]
z=stacked[:,2]

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter(x,y,z)
plt.xlim(0,300)
plt.ylim(0,300)

plt.show()

但情节导致这样的 错误情节

虽然我期待图表中间有一团点。我究竟做错了什么?

编辑 1> 要测试代码,请随意'Image Stacking\StarM '+ str(s) +'.png',0 在第 10 行使用此图像: https ://wetransfer.com/downloads/7a3cdac121427d122787b5e24943d4b320210412123454/edfcc9

编辑 2> 更改代码如下:

import numpy as np
import matplotlib.pyplot as plt



stacked = np.ndarray(shape=(300,300,20))


for s in range(11):
    s=s+1
    source = cv2.imread('ss\StarM '+ str(s) +'.png',2)
    m = np.asmatrix(source)
    stacked[:,:,s]=m

x=stacked[:,:,0]
y=stacked[:,:,1]
z=stacked[:,:,2]

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter(x,y,z)
plt.xlim(0,300)
plt.ylim(0,300)

plt.show() 

现在情节显示:WrongPlot2

谢谢

标签: pythonplotmultidimensional-arraydata-visualization

解决方案


好吧不得不从枕头开始重写我不知道opencv。

这是我的代码:


from PIL import Image

import numpy as np
import matplotlib.pyplot as plt


size_image = Image.open('StarM 1.png', 'r')

print(size_image.size)

stacked = np.ndarray(shape=(size_image.size[0], size_image.size[1], 11)) #empty array


for s in range(11):
    s = s+1
    source = Image.open('StarM ' + str(s) + '.png', 'r').convert('L') #open image convertiung it to grayscale
    # source.show() #show grayscale image
    # print('source :', source) #print image
    m = np.asarray(source) #convert image to array
    print(m) #print array 
    print(m.shape) #print array shape

    stacked[:, :, s-1] = m #fill empty array with image
    
# print(stacked)
print(stacked.shape) #print array shape


x,y,z =stacked.nonzero() #gets non zero values from stacked
print(x,y,z)
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter(x,y,z)
plt.show()

结果是:

在此处输入图像描述

不知道你期待的是什么让我知道。

将第 47 行更改为

x,y,z =(stacked >  100).nonzero() #gets >100 values from stacked

值范围从 0 到 255(请记住,我们使用的是 8 位灰度 0 - 255)

你会得到更好的照片:

在此处输入图像描述

借自从3D numpy 数组创建 3D 图


推荐阅读