wud*_*nao 11 python arrays numpy image-processing computer-vision
假设我有一个彩色图像,当然这将由python中的三维数组表示,比如说形状(nxmx 3)并将其称为img.
我想要一个新的2-d数组,称它为"narray"以具有形状(3,nxm),使得该数组的每一行分别包含R,G和B通道的"扁平"版本.此外,它应该具有我可以通过类似的东西轻松地重建任何原始频道的属性
narray[0,].reshape(img.shape[0:2]) #so this should reconstruct back the R channel.
Run Code Online (Sandbox Code Playgroud)
问题是如何从"img"构建"叙事"?简单的img.reshape(3,-1)不起作用,因为元素的顺序对我来说是不可取的.
谢谢
Div*_*kar 20
您需要使用np.transpose
重新排列尺寸.现在,n x m x 3
要转换为3 x (n*m)
,所以将最后一个轴发送到前面并向右移动剩余轴的顺序(0,1)
.最后,重塑3
成行.因此,实施将是 -
img.transpose(2,0,1).reshape(3,-1)
Run Code Online (Sandbox Code Playgroud)
样品运行 -
In [16]: img
Out[16]:
array([[[155, 33, 129],
[161, 218, 6]],
[[215, 142, 235],
[143, 249, 164]],
[[221, 71, 229],
[ 56, 91, 120]],
[[236, 4, 177],
[171, 105, 40]]])
In [17]: img.transpose(2,0,1).reshape(3,-1)
Out[17]:
array([[155, 161, 215, 143, 221, 56, 236, 171],
[ 33, 218, 142, 249, 71, 91, 4, 105],
[129, 6, 235, 164, 229, 120, 177, 40]])
Run Code Online (Sandbox Code Playgroud)
[原答案]
假设我们有一个img
size 的数组m x n x 3
要转换为一个new_img
size 的数组3 x (m*n)
初步解决方案:
new_img = img.reshape((img.shape[0]*img.shape[1]), img.shape[2])
new_img = new_img.transpose()
Run Code Online (Sandbox Code Playgroud)
[编辑答案]
缺陷:重塑从第一维开始并重塑剩余部分,该解决方案有可能混合来自第三维的值。对于图像来说,这在语义上可能是不正确的。
适配解决方案:
# Dimensions: [m, n, 3]
new_img = new_img.transpose()
# Dimensions: [3, n, m]
new_img = img.reshape(img.shape[0], (img.shape[1]*img.shape[2]))
Run Code Online (Sandbox Code Playgroud)
严格解决方案:
# Dimensions: [m, n, 3]
new_img = new_img.transpose((2, 0, 1))
# Dimensions: [3, m, n]
new_img = img.reshape(img.shape[0], (img.shape[1]*img.shape[2]))
Run Code Online (Sandbox Code Playgroud)
strict 是一种更好的方式来解释维度的顺序,而 和 的结果Adapted
在Strict
值 ( set(new_img[0,...])
) 方面将是相同的,但顺序会打乱。
归档时间: |
|
查看次数: |
44752 次 |
最近记录: |