![](/img/trans.png)
[英]Most dominant color in RGB image - OpenCV / NumPy / Python
[英]Image pixel differentiation in opencv Python based on rgb extract and settling
我正在使用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
但是,不是获取减去的背景图像,而是获取原始图像。 请帮忙
您正在操纵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
也许在这里也可以读一读: OpenCV-Python接口,cv和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]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.