使用numpy数组在多维数组(图像)上迭代-python

使用numpy数组在多维数组(图像)上迭代-python,numpy,python-2.7,Numpy,Python 2.7,嘿! 我有两个图像(相同尺寸)作为numpy数组imgA-imgB 我想迭代每一行和每一列,得到如下结果: for i in range(0, h-1): for j in range(0, w-1): final[i][j]= imgA[i,j] - imgB[i-k[i],j] 其中h和w是图像的高度和宽度,k是尺寸为[h*w]的数组 我看过这个话题: 但是它不适用于图像,我得到了一个错误:太多的值需要解包 使用numpy和Python2.7有什么方法可以做到这一点吗 谢谢 编

嘿! 我有两个图像(相同尺寸)作为numpy数组imgA-imgB 我想迭代每一行和每一列,得到如下结果:

for i in range(0, h-1):
  for j in range(0, w-1):
    final[i][j]= imgA[i,j] - imgB[i-k[i],j]
其中h和w是图像的高度和宽度,k是尺寸为[h*w]的数组

我看过这个话题: 但是它不适用于图像,我得到了一个错误:太多的值需要解包 使用numpy和Python2.7有什么方法可以做到这一点吗

谢谢

编辑 我试着自己更好地解释。 我在实验室颜色空间中有两张图像。 这些图像是(288384,3)。 现在我想制作deltaE,这样我就可以这样做(吐出2个阵列):

到现在为止一切都很好。 但是现在我有了这个数组k的大小(288384)。 现在我需要一个新的delta,但是x轴不同,比如imgRl(0,0)中的像素,我想在imgLl(0+k,0)中添加像素


你了解我的更多问题吗?

我非常确定,无论你想做什么,都可以矢量化,并且在没有任何循环的情况下运行。但是从你的代码编写方式来看,它不起作用也就不足为奇了

如果
k
是一个形状数组
(h,w)
,那么
k[i]
是一个形状数组
(w,)
。当您执行
i-k[i]
时,numpy将发挥其广播魔力,您将获得一个形状数组
(w,)
。因此,您使用一个shape
(w,)
数组和一个整数对
imgB
进行索引。因为索引中的一个项是数组,所以会起作用。因此,假设
imgB
也有shape
(h,w,1)
,那么
imgB[i-k[i],j]
的返回值将不是shape
(1,)
的数组,而是shape
(w,1)
的数组。然后,当你试着从
imgA[i,j]
中减去它时,这是一个形状数组
(1,)
,广播魔法再次起作用,因此你得到一个形状数组
(w,1)

我们不知道什么是
final
。但是,如果它是一个形状数组
(h,w,1)
,如
imgA
imgB
,那么
final[i][j]
是一个形状数组
(1,)
,您试图为它分配一个形状数组
(w,1)
,这不合适。因此,
操作数需要减少,但未启用减少
错误消息

编辑

你真的不需要拆分数组来计算DeltaE

def deltaE(a, b) :
    return np.sqrt(((a - b)**2).sum(axis=-1))

delta = deltaE(imgLabL, imgLabR)
我还是不明白在第二种情况下你想做什么。。。如果要比较沿x轴移动的两个图像,我建议使用:


将在位置
(r,c)
处具有
imgLabL的像素
(r,c)
imgLAbR的像素
(r-k,c)
之间的三角形。这就是你想要的吗?

我通常使用
numpy.nditer
,这些文档都是,并且有很多示例。简而言之:

import numpy as np
a = np.ones([4,4])

it = np.nditer(a)
for elem in a:
    #do stuff
您还可以使用c风格的迭代,即

while not it.finished:
    #do stuff
    it.iternext()

如果需要访问数组的索引。在你的情况下,我会将你的两个图像压缩在一起,创建一个形状数组
[2,h,w]
,然后迭代,用计算结果填充一个空数组。

你不是说imgA[I][j]-imgB[I-k[I]][j]?是的,对不起,我写错了,但我是这个意思。我的图像是384x288,但它是无限循环的,我也不能写final[i][j],但只能写final,因为我得到:valueError:output操作数需要缩减,但没有启用缩减。imgA[i][j]中有什么?是元组吗?如果是这样,那可能是你的问题。分配需要一个值。imgA是一个带有imgA的numpy数组。shape是288384,1。在这个k中,我有两幅图像的视差。我正在处理立体图像,我已经找到了视差(),所以现在我想用匹配点做三角,我应该使用这个视差。如果我答对了,imgA(x,y)中的点在imgB(x+disp,y)中有一个匹配点。因此我必须沿着x轴移动。我要试试这个np卷!顺便说一句,三角法效果很好!谢谢使用np.roll我得到了这个错误:只有长度为1的数组才能转换为python标量
import numpy as np
a = np.ones([4,4])

it = np.nditer(a)
for elem in a:
    #do stuff
while not it.finished:
    #do stuff
    it.iternext()