【发布时间】:2016-09-06 05:29:26
【问题描述】:
我有一些我想要处理的图像,问题是有两种图像都是 106 x 106 像素,一些是彩色的,一些是黑白的。
只有两 (2) 个维度:
(106,106)
一加三 (3)
(106,106,3)
有没有办法可以去掉最后一个维度?
我尝试了 np.delete,但它似乎不起作用。
np.shape(np.delete(Xtrain[0], [2] , 2))
Out[67]: (106, 106, 2)
【问题讨论】:
我有一些我想要处理的图像,问题是有两种图像都是 106 x 106 像素,一些是彩色的,一些是黑白的。
只有两 (2) 个维度:
(106,106)
一加三 (3)
(106,106,3)
有没有办法可以去掉最后一个维度?
我尝试了 np.delete,但它似乎不起作用。
np.shape(np.delete(Xtrain[0], [2] , 2))
Out[67]: (106, 106, 2)
【问题讨论】:
您可以使用 numpy 的精美索引(Python 内置切片表示法的扩展):
x = np.zeros( (106, 106, 3) )
result = x[:, :, 0]
print(result.shape)
打印
(106, 106)
(106, 106, 3) 的形状意味着您有 3 组具有(106, 106) 形状的事物。因此,为了“剥离”最后一个维度,您只需选择其中一个(这就是花哨的索引所做的)。
你可以保留任何你想要的切片。我随意选择保留第 0 个,因为你没有指定你想要什么。因此,result = x[:, :, 1] 和 result = x[:, :, 2] 也会给出所需的形状:这完全取决于您需要保留哪个切片。
【讨论】:
只取颜色维度上的平均值 (axis=2):
Xtrain_monochrome = Xtrain.mean(axis=2)
【讨论】:
当您的数组的形状为(106, 106, 3) 时,您可以将其可视化为具有106 行 和106 列 的表格,其中填充了每个点为@ 的数据点987654322@,我们可以表示为[x, y ,z]。因此,如果要获取维度(106, 106),则必须使表中的数据点不是数组而是单个数字。您可以通过提取每个数据点的 x 分量、y 分量或 z 分量 或通过应用以某种方式聚合三个分量的函数(如 mean、sum、 max 等。 您可以像上面建议的 @matt Messersmith 一样提取任何组件。
【讨论】:
好吧,当您尝试减小图像的尺寸时应该小心。 图像通常是包含每个像素的 RGB 值数据的 3-D 矩阵。如果您想将其缩小为 2-D,您真正要做的是将彩色 RGB 图像转换为灰度图像。
并且有几种方法可以做到这一点,例如您可以取最大值三个、最小值、平均值、总和等,具体取决于您想要的图像精度。您可以做的最好的事情是使用公式对 RGB 值进行加权平均
Y = 0.299R + 0.587G + 0.114B
其中 R 代表红色,G 代表绿色,B 代表蓝色。在 numpy 中,这可以写成
new_image = img[:, :, 0]*0.299 + img[:, :, 1]*0.587 + img[:, :, 2]*0.114
【讨论】:
实际上np.delete 可以应用两次, 例如,如果您想保留第一个频道,则可以运行以下命令:
Xtrain = np.delete(Xtrain,2,2) # this will get rid of the 3rd component of the 3 dimensions
print(Xtrain.shape) # will now output (106,106,2)
# again we apply np.delete but on the second component of the 3rd dimension
Xtrain = np.delete(Xtrain,1,2)
print(Xtrain.shape) # will now output (106,106,1)
# you may finally squeeze your output to get a 2d array
Xtrain = Xtrain.squeeze()
print(Xtrain.shape) # will now output (106,106)
【讨论】: