Python中的颜色空间3D曲面绘图

3
我的电脑配置是Mac Mojave 10.14.4。我刚接触Python,所以我使用Jupyter Lab以便了解每个部分的作用,请您做出类似的回应。
我想生成一个数字印花织物样品的三维表面图,其中z轴绘制颜色空间。
这是实体文件。
[Test Sample Dots Print]
这是同一测试织物的3dContour图。

Ultra Cotton Plot

img = cv2.imread(testROYGBIVB.jpg) img - cv2.cvtColor(img,  
cv2.COLOR_BGR2HSV)

plt.imshow(img)
img0 = img
img0.shape
(70, 90,3)

x, y, z = img0.T
x = np.linspace(0, 7, 70) #start, step, total
y = np.linspace(0, 9, 90)
X, Y = np.meshgrid(x, y) 
Z = np.invert(z) #makes it easier to view

font = {'family': 'sans-serif',
    'color':  'black',
    'weight': 'normal',
    'size': 16,
    }

 fig = plt.figure()

 ax = plt.axes(projection='3d')
 ax.contour3D(X, Y, Z, 256, cmap='cubehelix_r')
 ax.set_xlabel('x',fontdict=font)
 ax.set_ylabel('y',fontdict=font)
 ax.set_zlabel('z',fontdict=font); #RGB values
 ax.set_title('Ultra Cotton',fontdict=font);

 plt.tight_layout()
 plt.savefig('UltaCotton.png')
 ax.view_init(60, 35)
 fig

[来自上方的精彩]

我的问题是 - 我的图表颜色空间值为HSV。 如下所示,我可以拆分这些值以创建散点图。

但是,我希望保留轮廓的杆状结构,但杆的颜色与定义的颜色空间HSV匹配,就像散点图中所看到的那样。

我希望我的轮廓图和散点图有一个混合体。

FYI-倒置了z值,以便顶部表面易于查看。

能做到吗?谢谢

flags = [i for i in dir(cv2) if i.startswith('COLOR_')]
len(flags)
258
flags[40]
'COLOR_BGR2RGB'

hsv_img = cv2.cvtColor(img, cv2.COLOR_RGB2HSV)
pixel_colors = img.reshape((np.shape(img)[0]*np.shape(img)[1], 3))
norm = colors.Normalize(vmin=-1.,vmax=1.)
norm.autoscale(pixel_colors)
pixel_colors = norm(pixel_colors).tolist()

h, s, v = cv2.split(hsv_img)
fig = plt.figure()
axis = fig.add_subplot(1, 1, 1, projection="3d")
axis.scatter(h.flatten(), s.flatten(), v.flatten(), facecolors=pixel_colors,    marker=".")
axis.set_xlabel("Hue")
axis.set_ylabel("Saturation")
axis.set_zlabel("Value")
plt.show()

![Hue Sat 和 Val 的 X、Y、Z 分割]4

plt.tight_layout()
plt.savefig('filename.png')
axis.view_init(45, 35)
#ax.set_title('Ultra Cotton');
plt.tight_layout()
plt.savefig('filenameView.png')
fig

[同之前,视角更好]


我确实有些难以理解这个问题的实际含义,特别是因为某些部分似乎重复了。无论如何,你的问题似乎部分源于numpy中没有“linespace” - 这是因为它被称为“linspace”(没有e)。 - ImportanceOfBeingErnest
我需要一种替代方法来创建这个图表,同时我试图弄清楚numpy。我是新手。但肯定有人知道其他库或某种解决方法。我上面的长问题是为了证明请求帮助的必要性,以免有人建议我已经探索过的东西。 - Krackle
Lin 转 Line 是自动更正,抱歉。 - Krackle
我只是认为这种类型的绘图不可能。每个像素等于单个颜色值的“棒”。我的真实样本是(4032,3024,3)。唉! - Krackle
请编辑您的原始问题,删除重复部分并将linEspace更正为linspace。请提供一些样本数据,以便我们了解您正在处理什么数据。根据织物颜色样本,我无法真正理解您拥有哪些数据。 - flurble
1个回答

3

像其他人一样,我对你试图实现的目标感到困惑。

这是否与你所想的有些相似?

img = plt.imread('Jb2Y5.jpg')
nx,ny,_ = img.shape
X, Y = np.meshgrid(np.linspace(0,ny,ny),np.linspace(0,nx,nx)) 
fig, (ax1, ax2, ax3) = plt.subplots(1,3,subplot_kw=dict(projection='3d'), figsize=(10,3))
ax1.plot_surface(X,Y, img[:,:,0], cmap="Reds", alpha=0.5)
ax1.set_title('RED')
ax2.plot_surface(X,Y, img[:,:,1], cmap='Greens', alpha=0.5)
ax2.set_title('GREEN')
ax3.plot_surface(X,Y, img[:,:,2], cmap='Blues', alpha=0.5)
ax3.set_title('BLUE')

enter image description here


是的和不是。我不是特别关注颜色分离,而是希望峰值颜色的面值得到体现。 - Krackle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接