我正在使用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
但是,我没有获得减去的背景图像,而是获得原始图像。 请帮忙
答案 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]