用于特定颜色部分提取的 Numpy

问题描述

我对 python 非常陌生,并试图将图像中的彩色部分与灰度分开。 尽管此代码(见下文)为我提供了我正在寻找的结果,但它需要很长时间(在正常图像上需要 10 秒以上)。

我找了一个小时,没有找到合适的答案,因为大多数只是将特定颜色(黑色、白色、...)或阈值分开。

据我(已经)知道 numpy 是要走的路,但我没有成功:S

期待帮助 - 谢谢!!

    gray_elements = np.zeros_like(image)
    gray_elements[:] = 255

    colored_segments = np.zeros_like(image)
    colored_segments[:] = 255
    
    # Separate black-to-white-colors from colored
    for y in range(image.shape[0]):
        for x in range(image.shape[1]):

            pxl = image[y,x]
            if max(pxl) - min(pxl) > 5:
                colored_segments[y,x] = pxl
            else:
                gray_elements[y,x] = pxl

解决方法

未经测试,但因为是圣帕特里克节...

如果您有一个包含 3 通道 RGB 图像的 Numpy 数组 na,它将具有 na.shape(h,w,3)

您可以通过以下方式获得每个点 3 个通道中的最大值:

ma = np.amax(na,axis=2,keepdims=True)

和最小值:

mi = np.amin(na,keepdims=True)

然后区别:

diff = ma - mi

然后制作一个布尔(真/假)掩码:

grey = diff < 5

如果/当您对 Numpy 更加熟悉时,您可能会使用 peak-to-peak 函数。


但通常情况下,您会使用 OpenCV 转换为 HSL 色彩空间,然后找到饱和度通道较低的像素,这意味着颜色是不饱和的且相当灰色。