Python中色彩空间的3D表面图

时间:2019-04-23 23:29:46

标签: python macos matplotlib jupyter

我的计算机设置为Mac Mojave 10.14.4。 我是Python的新手,所以我正在使用Jupyter Lab,以便我能够了解每个零件的生产情况,因此请您能以同样的方式答复。

我想用z轴绘制色彩空间来生成数字印刷织物样品的3d表面图。

这是纸质文件。

[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

[Awesomeness from Abov]

我的问题是-我的绘图的色彩空间值为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()

![X,Y,Z split for Hue Sat and Val] 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

[same as before better viewing angle]

1 个答案:

答案 0 :(得分:1)

和其他人一样,我对您要实现的目标感到困惑。

这与您的想法是否一样?

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