在python

时间:2016-04-08 00:48:30

标签: python arrays numpy multidimensional-array

我尝试切片表示彩色图像的ndarray三维实例,其中二维数组中的每个元素(或像素)包含一个3字节对应红色,绿色值的数组和蓝色分别。我想分别为每种颜色切出2-D ndarray,这样我就可以根据我们的实现要求对它们进行压平并将它们端到端地连接起来。我目前正在尝试的代码是......

red = image[:, :, 0]
green = image[:, :, 1]
blue = image[:, :, 2]
collapsed_image = numpy.concatenate((red.flatten('C'), green.flatten('C'), blue.flatten('C')), axis=0)

其中image是我的numpy.ndarray对象,包含3-D字节数组。这是否能够切割出每个颜色的二维阵列,并将它们端对端压平/连接在一起?

2 个答案:

答案 0 :(得分:0)

你的意思是要实现这样的输出吗?

from scipy.ndimage import *
import matplotlib.pyplot as p
%matplotlib inline

im=imread('rgb.png')
print np.shape(im)

p.subplot(121)
p.imshow(im)

red = im[:, :, 0]
green = im[:, :, 1]
blue = im[:, :, 2]
imchannels = np.concatenate((red, green, blue))

p.subplot(122)
p.imshow(imchannels)

输出:

(215L, 235L, 3L)

enter image description here

答案 1 :(得分:0)

ndarray已经是内存字节的扁平集合,但并不总是按所需顺序排列。 np.rollaxis可以修改它。

举个简单的例子:

首先是经典的2x2图像(每个数字与运河相关联):

image=np.arange(12).reshape(2,2,3)%3

In [08]: image
Out[08]: 
array([[[0, 1, 2],
        [0, 1, 2]],

       [[0, 1, 2],
        [0, 1, 2]]], dtype=int32)

另一种观点,运河第一:

bycolor= r,g,b = np.rollaxis(image,axis=2)

In [10]: bycolor
Out[10]: 
array([[[0, 0],
        [0, 0]],

       [[1, 1],
        [1, 1]],

       [[2, 2],
        [2, 2]]], dtype=int32)

并展平布局:

In [11]: image.flatten()
Out[11]: array([0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2], dtype=int32)

In [12]: bycolor.flatten()
Out[12]: array([0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2], dtype=int32)

我认为最后一个是你想要的:np.rollaxis(image,2).flatten()