所以我有一批彩色图像,我想让它们成为灰度图像。唯一的问题是,有时图像的形状为[batch_size, channels, height, width]
,有时它们是[batch_size, height, width, channels]
。我需要一个能够获取一批彩色图像的功能(无论它具有哪两种形状),并提供一批形状为[batch_size, height, width, channels]
的灰度图像(当然,通道为1)。
到目前为止,我有这个功能:
from scipy import misc
def color_to_grayscale(image_batch, dim_order='NHWC'):
grayscale_batch = np.array()
if dim_order='NCHW':
image_batches = np.transpose(image_batch, [0, 2, 3, 1])
else:
image_batches = image_batch
for idx in range(image_batches[0].shape):
image = image_batches[idx, :, :, :]
grayscale = np.zeros((image.shape[0], image.shape[1]))
for rownum in range(len(image)):
for colnum in range(len(image[rownum])):
grayscale[rownum][colnum] = np.average(image[rownum][colnum])
grayscale = np.array(grayscale, dtype="float32")
grayscale = grayscale.reshape((grayscale.shape[0], grayscale.shape[1], 1))
grayscale_batch = np.stack(grayscale, grayscale_batch)
return grayscale_batch
我正在考虑在for循环结束时执行np.vstack来重建批处理,但它看起来很乱。此外,我不在考虑上述两个案例(维度)。
有什么想法吗?
编辑:更新了我希望工作的代码(但仍然没有)。
答案 0 :(得分:0)
您不需要进行任何循环,堆叠或任何操作,只需在频道轴上使用numpy.mean()
# axis=-1 is channels, keepdims is optional
greyscale_image_batch = numpy.mean(image_batch, axis=-1, keepdims=True)
image_batch.shape # [batch_size, height, width, channels]
greyscale_image_batch.shape # [batch_size, height, width, 1]
要使阵列形状正确,您可以使用transpose()
:
if image_batch.shape[1] == 3:
image_batch = image_batch.transpose([0, 2, 3, 1])