【问题标题】:What's the fastest way to remap pixel values in OpenCV in Python?在 Python 中重新映射 OpenCV 中的像素值的最快方法是什么?
【发布时间】:2023-03-10 02:25:01
【问题描述】:

我有一个单通道图像gray_image,像素值[0 .. 255] 和一个将这些值映射到颜色的查找表:

lookup = {
 0: [0, 0, 0],
 1: [23, 54, 35],
 ...
 255: [200, 52, 20],
}

创建一个新的 3 通道图像的最快方法是什么,其中每个像素都根据在原始图像中的值的查找来着色,例如

color_image[y, x] = lookup[gray_image[y, x]]

而不是遍历每个像素并单独设置?

【问题讨论】:

    标签: python opencv opencv-python


    【解决方案1】:

    假设查找表的键排序正确,您可以将字典转换为数组,然后像这样应用 NumPy 的 advanced indexing

    import numpy as np
    
    palette = np.array([row for row in lookup.values()])
    color_image = palette[gray_image]
    

    如果您的字典的键没有排序,上面的代码将不起作用。在这种情况下,您可以将字典转换为数组,如下所示:

    palette = np.zeros(shape=(256, 3), dtype=np.uint8)
    for key in lookup.keys():
        palette[key] = lookup[key]
    

    这种方法隐式定义了一个默认值[0, 0, 0],即如果查找表不包含某个索引,比如说n,那么那些灰度为n的像素将被映射到[0, 0, 0](黑色)。

    【讨论】:

      【解决方案2】:
      palette = np.array([lookup[index] for index in range(256)], dtype=np.uint8)
      color_image = palette[gray_image]
      

      另一个答案没有确保按键对字典进行排序(python dicts 只是最近才获得稳定的对顺序)并且它没有确保所有索引值都存在。

      【讨论】:

      • 在最后一行添加“color_image = color_image.astype('uint8')”,因为您将无法在窗口中显示图片。
      • 感谢您指出这一点!我更改了答案并将类型放在调色板上,这样可以节省一些空间,并且在查找后无需在整个图片上转换类型。
      • 您有正确的方法,但由于 OP 使用的是 OpenCV,您可以使用 cv2.LUT() 进行查找,它在我的机器上运行 1920x1080 图像的速度提高了大约 20 倍。
      • 您应该将其发布为答案
      • 我不想拿分明是你的。
      猜你喜欢
      • 1970-01-01
      • 2010-09-30
      • 2010-10-21
      • 1970-01-01
      • 2012-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多