图像处理:矢量化numpy数组元素替换

时间:2018-05-19 23:54:00

标签: python performance numpy image-processing scikit-image

代码运行良好但速度很慢。如何对颜色替换进行矢量化以避免使用Python for循环?

processed_image = np.empty(initial_image.shape)
for i, j in np.ndindex(initial_image.shape[:2]):
    l_, a, b = initial_image[i, j, :]
    idx = mapping[a + 128, b + 128]
    a, b = new_colors[tuple(idx)]
    processed_image[i, j] = l_, a, b

我在CIELAB空间中有一个图像initial_image作为numpy数组的形状(有些高度,有些宽度,3)。我需要使用mapping更改图像的 a b 颜色分量来生成校正后的图像。 mapping是一个形状(255,255,2)的numpy数组。它为我提供了索引,可用于从new_colors更正 a b 颜色。 new_colors的形状为(表格高度,表格宽度,2)

使用scikit-image的解决方案也会有所帮助。

1 个答案:

答案 0 :(得分:3)

您可以使用高级索引:

# chain the two maps
chained = new_colors[(*np.moveaxis(mapping, 2, 0),)]
# split color channels
c1, *c23 = np.moveaxis(initial_image, 2, 0)
# add 128
c23 = *map(np.add, c23, (128, 128)),
# apply chained map
processed_image_2 = np.concatenate([c1[..., None], chained[c23]], axis=2)