【问题标题】:Check if RGB values of an image meet conditions without a loop检查图像的 RGB 值是否满足没有循环的条件
【发布时间】:2020-05-19 18:18:33
【问题描述】:

假设我有一个彩色图像 img,定义如下。我有 R、G 和 B 的范围值:R1、R2、B1 等等...

如果满足以下条件,现在我想将图像的所有 RGB 值设置为 [255, 0, 0] [(R1 > R & R G & G B & B

我可以通过循环到图像的所有 RGB 值来做到这一点,但我不想那样做。有没有一种方法可以让我以 NumPyish 的方式实现这个?或者实现这一点的最佳方法是什么?

img = cv2.imread(file)
R1 = 91
R2 = 150
G1 = 10
G2 = 100
B1 = 100
B2 = 150

【问题讨论】:

标签: python numpy


【解决方案1】:

您可以使用 numpy 像 img[:,:,2] > R1 一样为红色通道一次对每个颜色通道进行颜色比较。您可以像这样将所有这些组合在一起。

# opencv stores colour channels in BGR order by default normally
img[(img[:,:,0] > B1) &(img[:,:,0] < B2) & (img[:,:,1] > G1) & (img[:,:,1] < G2) & (img[:,:,2] > R1) & (img[:,:,2] < R2),:] = [0,0,255]

【讨论】:

    【解决方案2】:

    您可以将元素R1,R2,...,G1,G2,...,B1,B2,... 放入一个数组中,并通过以下方式检查条件:

    import numpy as np
    R = 90 # example
    array=np.array([[R1,R2],[G1,G2],[B1,B2]])
    

    并且使用numpy where函数,您可以指定条件,例如&lt;R以及条件满足或不满足的操作。

    np.where(array[:,0]<R, 255, array[:,0]) # for R1,G1,B1
    np.where(array[:,1]<R, 0, array[:,0]) # for R2,G2,B2 and so on
    

    你可以从这里修改。

    np.where(array[:,0]&lt;R, 255, array[:,0]) 遍历元素,如果元素小于 R,则将元素替换为 255,否则不修改元素。

    【讨论】:

      【解决方案3】:

      只需创建一个函数并将其应用于您的元素。可能仍然在内部使用 for 循环。图片在opencv中为BGR格式。

      func = lambda x: [0, 0, 255] if (R1 > x[2] & x[2] < R2) & (G1 > x[1] & x[1] < G2) & (B1 > x[0] & x[0] < B2) else x
      img2 = numpy.apply_along_axis(func, 0, img)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-06
        • 2019-10-23
        • 2019-03-16
        • 1970-01-01
        • 2022-06-13
        相关资源
        最近更新 更多