opencv图像处理维度不匹配错误
错误一ValueError: too many values to unpack (expected 2)
由于opencv处理图像时,图像是三维张量,所以在获取其长和宽时要这样
rows,cols= image.shape[:2] #而不能是这样rows,cols= image.shape !!!
#这里取前两个dim ,如果是要将image的所有的三个维度都取出来则可以写image.shape
错误二ValueError: could not broadcast input array from shape (807,1751,3) into shape (807,1751)
#图像积分
def integral(image):
rows,cols= image.shape[:2] #注意这里取前两个dim
#行积分运算
inteImageC=np.zeros((rows,cols),np.float32) #或者是inteImageC=np.zeros(image.shape,np.float32)
for r in range(rows):
for c in range(cols):
if c==0:
inteImageC[r][c]=image[r][c]
else:
inteImageC[r][c]=inteImageC[r][c-1]+image[r][c]
#列积分运算
inteImage=np.zeros(image.shape,np.float32)
for c in range(cols):
for r in range(rows):
if r==0:
inteImage[r][c]=inteImageC[r][c]
else:
inteImage[r][c]=inteImage[r-1][c]+inteImageC[r][c]
inteImage_0=np.zeros((rows+1,cols+1,3),np.float32)
inteImage_0[1:rows+1,1:cols+1]=inteImage
return inteImage_0
这段程序的倒数第三行是正确的,而不能这样写inteImage_0=np.zeros((rows+1,cols+1),np.float32) ,如这样写就会出现这个第二类错误,也是维度不匹配的问题,因为如果这样写,由于image是三维的,而inteImage_0是二维的,显然是不匹配的,就不能执行倒数第二行的赋值了。
错误三 ValueError: setting an array element with a sequence.
还是上面那段程序
#图像积分
def integral(image):
rows,cols= image.shape[:2] #注意这里取前两个dim
#行积分运算
inteImageC=np.zeros((rows,cols),np.float32)
for r in range(rows):
for c in range(cols):
if c==0:
inteImageC[r][c]=image[r][c]
else:
inteImageC[r][c]=inteImageC[r][c-1]+image[r][c]
#列积分运算
inteImage=np.zeros(image.shape,np.float32)
for c in range(cols):
for r in range(rows):
if r==0:
inteImage[r][c]=inteImageC[r][c]
else:
inteImage[r][c]=inteImage[r-1][c]+inteImageC[r][c]
inteImage_0=np.zeros((rows+1,cols+1,3),np.float32)
inteImage_0[1:rows+1,1:cols+1]=inteImage
return inteImage_0
看这个第五行,如果写成 inteImageC=np.zeros((rows,cols),np.float32) 这样就是错误的,原因和第二个错误一样,都是image是三维的,你如果使 inteImageC是个二维数组的话,下面是没法通过 image给inteImageC赋值的,所以正确的写法应该是
inteImageC=np.zeros((rows,cols,3),np.float32)
#或者是
inteImageC=np.zeros(image.shape,np.float32)
三个错误其实都是一类错误,dim不匹配的问题,以后写是还需注意。
参考链接:https://blog.csdn.net/niruoanhaoshiqintian/article/details/82959672