【问题标题】:Python find colors in image array and fill 2D array with valuePython在图像数组中查找颜色并用值填充二维数组
【发布时间】:2021-02-10 04:37:27
【问题描述】:

我有一个带有颜色分割的图像,我想从 BGR 颜色列表中找到具有颜色的像素。从这些像素索引中,我想用一些任意值填充二维数组。我已经完成了,但是速度非常慢:

#load image with color segmentations
img = cv2.imread(segmented_img_path)
#create empty output array
output = np.zeros((img.shape[0], img.shape[1]))
#iterate over image and find colors
for i, row in enumerate(img):
    for j, bgr in enumerate(row):
        if np.any(np.all(np.isin(np.array(color_list),bgr,True),axis=1)):
            output[i,j] = float(some_value)

必须有一种更快的方法来做到这一点,可能使用 np.where 但我就是想不通。

【问题讨论】:

    标签: python image numpy colors


    【解决方案1】:

    我认为这可以按照下面的例子来完成。下面是一个简化的示例,可以根据您的需要进行扩展。

    m = np.array(([1,2,3], [4,5,6], [1,2,3]))
    d = np.zeros((np.shape(m)))
    BGR = [1,3]
    for color in BGR:
       d[m==color] = color+1000
    

    我们只需循环遍历您想要在 BGR 列表中找到的颜色值,然后在 for 循环中替换它们。这里 color+1000 是您引用的任意值 到。

    对于您的情况,它将如下所示:

    img = cv2.imread(segmented_img_path)
    output = np.zeros((img.shape))
    for bgr in BGR:
       output[img==bgr] = float(some_value)
    

    【讨论】:

    • 此外,如果您正在使用大型阵列(图像)并拥有 NVIDIA 显卡,请查看 cupy 代替 numpy。它具有相同的符号,但使用图形卡来大大增强基于矩阵的数学运算。性能可能会快几个数量级。
    • 这不起作用,因为我的输出与图像的形状不同。图像有 3 个维度:w、h 和通道。我的输出只是一个二维数组。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-22
    • 2021-04-14
    • 2016-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多