基于rgb提取和解析的opencv Python中的图像像素区分

时间:2018-01-23 06:35:41

标签: python-3.x opencv

我正在使用Pyton版本3. *和opencv 3. *。在下面的代码中,我想基于角像素减去整个背景,以获得前景对象

def background_subtract(img,l):
    print("Extract the background pixel")
    image = cv2.imread(img,cv2.IMREAD_ANYCOLOR)
    r,g,b=image[0,0]
    t,d,m= image.shape
    for i in range(t):
        for j in range(d):
            r1,g1,b1=image[i,j]
            if r1>=r:
                r1=0
            if g1>=g:
                g1=0
            if b1>=b:
                b1=0
     path='C:\\Users\\UST\\Desktop'
     if not os.path.exists(path):
     os.makedirs(path)
     cv2.imwrite(os.path.join(path,'background_subtract%d.jpg' %l),image)
     path =os.path.join(path,'%d.jpg' %l)
     print(path)
     return path

但是,我没有获得减去的背景图像,而是获得原始图像。 请帮忙

1 个答案:

答案 0 :(得分:2)

您正在操纵rgb值但未设置它们:

for i in range(t):
        for j in range(d):
            r1,g1,b1=image[i,j]
            if r1>=r:
                r1=0
            if g1>=g:
                g1=0
            if b1>=b:
                b1=0
            image[i,j] = [r1,g1,b1]  # this line is missing

也许还可以在这里阅读:Performance comparison of OpenCV-Python interfaces, cv and cv2

如果您熟悉numpy,可以通过更快的速度操纵cv2。

编辑:

你的方法会遇到问题,如果你的边框像素是亮红色(255,0,0),那么你的图片将有一个0的红色通道,绿色和蓝色相同,因为你将每个像素归零红色通道如果是"较少"而不是边境上的那个。

你可以玩

r,g,b=image[0,0]    # border pixel
delta = 10          # similarity to border pixel 
r_range = range( r-delta, r+delta+1)  
g_range = range( g-delta, g+delta+1)
b_range = range( b-delta, b+delta+1)

并检查您当前看到的所有3 rgb像素是否为in各自的范围 - 如果是,请将其设置为[0,0,0]

for i in range(t):
        for j in range(d):
            r1,g1,b1=image[i,j]
            if r1 in r_range and g1 in g_range and b1 in b_range:
                image[i,j] = [0,0,0]