使用numpy数组在多维数组(图像)上迭代-python
嘿! 我有两个图像(相同尺寸)作为numpy数组imgA-imgB 我想迭代每一行和每一列,得到如下结果:使用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有什么方法可以做到这一点吗 谢谢 编
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()