代码运行良好但速度很慢。如何对颜色替换进行矢量化以避免使用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的解决方案也会有所帮助。
答案 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)