python cv中的值错误

python cv中的值错误,python,opencv,qr-code,Python,Opencv,Qr Code,我正在尝试将单色3通道QR中的黑色图案更改为任何其他颜色,但我一直都遇到这个错误 如果k.any()==[0,0,0]: ValueError:包含多个元素的数组的真值不明确。使用a.any()或a.all() 下面给出了我正在尝试的代码: import cv2 import numpy as np img = cv2.imread('C:/New folder (2)/new1.png') rows,cols,bands = img.shape print rows,cols,bands

我正在尝试将单色3通道QR中的黑色图案更改为任何其他颜色,但我一直都遇到这个错误

如果k.any()==[0,0,0]: ValueError:包含多个元素的数组的真值不明确。使用a.any()或a.all()

下面给出了我正在尝试的代码:

import cv2
import numpy as np
img = cv2.imread('C:/New folder (2)/new1.png')

rows,cols,bands = img.shape 
print rows,cols,bands
for i in xrange (rows):
    for j in xrange (cols):
        k = img[i,j]
        if k.any()==[0,0,0]:
            img[i,j]==[255,255,255]
cv2.imshow('r',r)
cv2.waitKey(0)
我正在使用的图像附在下面。请帮我摆脱这一切


虽然我已经在您的帖子中纠正了您的缩进错误,但您有两个小错误:

1.)np.any()的语法错误

2.)指定新的像素值时,您会进行比较,这对值没有影响

随附带注释的更正代码:

import cv2
import numpy as np
img = cv2.imread('image.png')

rows,cols,bands = img.shape 
print rows,cols,bands
for i in xrange (rows):
    for j in xrange (cols):
        k = img[i,j]
        #corrected syntax for comparison of multiple components
        if np.all(k==[0,0,0]):
            # Use = instead of == in next line, you do not want to compate
            img[i,j]=[120,0,255]
cv2.imshow('r',img)
cv2.waitKey(0)
然而最后一句话:我只是直接回答了你的问题,单像素循环根本不是你应该用OpenCV选择的解决方案

虽然这看起来更复杂,但在OpenCV中实现这一点的更充分(更快)的方法如下所示:

import cv2
import numpy as np
img = cv2.imread('image.png')

rows,cols,bands = img.shape 
print rows,cols,bands

# Create image with new colour for replacement
new_colour_image= np.zeros((rows,cols,3), np.uint8)
new_colour_image[:,:]= (255,0,0) 

# Define range of color to be exchanged (in this case only one single color, but could be range of colours)
lower_limit = np.array([0,0,0])
upper_limit = np.array([0,0,0])

# Generate mask for the pixels to be exchanged
new_colour_mask = cv2.inRange(img, lower_limit, upper_limit)

# Generate mask for the pixels to be kept
old_image_mask=cv2.bitwise_not(new_colour_mask)


# Part of the image which is kept
img2= cv2.bitwise_and(img,img, old_image_mask)

# Part of the image which is replaced
new_colour_image=cv2.bitwise_and(new_colour_image,new_colour_image, new_colour_mask)

#Combination of the two parts
result=cv2.bitwise_or(img2, new_colour_image)

cv2.imshow('image',img)
cv2.imshow('mask',new_colour_mask)
cv2.imshow('r',result)
cv2.waitKey(0)

虽然我在您的帖子中纠正了您的缩进错误,但您有两个小错误:

1.)np.any()的语法错误

2.)指定新的像素值时,您会进行比较,这对值没有影响

随附带注释的更正代码:

import cv2
import numpy as np
img = cv2.imread('image.png')

rows,cols,bands = img.shape 
print rows,cols,bands
for i in xrange (rows):
    for j in xrange (cols):
        k = img[i,j]
        #corrected syntax for comparison of multiple components
        if np.all(k==[0,0,0]):
            # Use = instead of == in next line, you do not want to compate
            img[i,j]=[120,0,255]
cv2.imshow('r',img)
cv2.waitKey(0)
然而最后一句话:我只是直接回答了你的问题,单像素循环根本不是你应该用OpenCV选择的解决方案

虽然这看起来更复杂,但在OpenCV中实现这一点的更充分(更快)的方法如下所示:

import cv2
import numpy as np
img = cv2.imread('image.png')

rows,cols,bands = img.shape 
print rows,cols,bands

# Create image with new colour for replacement
new_colour_image= np.zeros((rows,cols,3), np.uint8)
new_colour_image[:,:]= (255,0,0) 

# Define range of color to be exchanged (in this case only one single color, but could be range of colours)
lower_limit = np.array([0,0,0])
upper_limit = np.array([0,0,0])

# Generate mask for the pixels to be exchanged
new_colour_mask = cv2.inRange(img, lower_limit, upper_limit)

# Generate mask for the pixels to be kept
old_image_mask=cv2.bitwise_not(new_colour_mask)


# Part of the image which is kept
img2= cv2.bitwise_and(img,img, old_image_mask)

# Part of the image which is replaced
new_colour_image=cv2.bitwise_and(new_colour_image,new_colour_image, new_colour_mask)

#Combination of the two parts
result=cv2.bitwise_or(img2, new_colour_image)

cv2.imshow('image',img)
cv2.imshow('mask',new_colour_mask)
cv2.imshow('r',result)
cv2.waitKey(0)

在这里,您希望将数组与[0,0,0]进行比较,但是,k.any()将返回布尔值而不是数组,因此无法与[0,0,0]进行比较

有一些方法可以解决这个问题。我想建议使用


如果直接使用k.any()或k.all()。它们都返回一个布尔值,any()检查是否存在none-0,all()检查是否存在0。

这里您想将数组与[0,0,0]进行比较,但是,k.any()将返回一个布尔值而不是数组,因此无法与[0,0,0]进行比较

有一些方法可以解决这个问题。我想建议使用


如果直接使用k.any()或k.all()。它们都返回一个布尔值,any()检查是否没有-0,all()检查是否有0。

thanx a ton。。可能是在post粘贴程序时,引入了缩进错误。使用mask真的是一个很好的解决方案,因为使用这个程序会变得更快..你让我的daythanx变成了一吨。。可能是在post粘贴程序时,引入了缩进错误。使用mask确实是一个很好的解决方案,因为这个程序会变得更快..你让我很高兴感谢你的回答..我想k.any()会检查数组中是否有任何0值。现在解决了这个问题。感谢您的帮助非常感谢您的回答…我想k.any()会检查数组中是否有任何0值。现在解决了这个问题。谢谢你的帮助