检查图像的RGB值是否满足条件而无循环

时间:2020-05-19 09:45:44

标签: python numpy

说我有一个彩色图像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

3 个答案:

答案 0 :(得分:0)

您可以使用红色spark-submit \ --conf "spark.driver.extraClassPath=/lib/<jar_file_a>.jar:/lib/<jar_file_a>.jar" \ --conf "spark.executor.extraClassPath=/lib/<jar_file_a>.jar:/lib/<jar_file_a>.jar" \ [...] 之类的numpy一次对每个颜色通道进行颜色比较。您可以像这样将所有这些结合在一起。

img[:,:,2] > R1

答案 1 :(得分:0)

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

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

使用numpy where函数,您可以指定条件,例如<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]<R, 255, array[:,0])遍历元素,如果元素小于R则用255替换该元素,否则不修改该元素。

答案 2 :(得分:0)

只需创建一个函数并将其应用于您的元素即可。可能仍在内部使用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)