嘿!我有两个图像(相同的维度)作为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]的阵列。
我看过这个题目:Iterating over a numpy array,但它不工作的图像,我得到的错误:太多的值需要解包有什么方法可以在numpy和python 2. 7中实现吗?
谢谢
编辑我试图解释得更好。我有2个图像在LAB颜色空间。这些图像是(288,384,3)。现在我想使deltaE,所以我可以这样做(拆分2个数组):
imgLabL=np.dsplit(imgL,3)
imgLabR=np.dsplit(imgR,3)
imgLl=imgLabL[0]
imgLa=imgLabL[1]
imgLb=imgLabL[2]
imgRl=imgLabR[0]
imgRa=imgLabR[1]
imgRb=imgLabR[2]
delta=np.sqrt(((imgLl-imgRl)**2) + ((imgLa - imgRa)**2) + ((imgLb - imgRb)**2) )
到目前为止一切都很好,但是现在我有了一个k大小的数组,所以现在我需要一个新的delta,但是x轴不同,比如imgRl(0,0)中的像素,我想把imgLl(0+k,0)中的像素加起来
你还知道我的问题吗
2条答案
按热度按时间tpgth1q71#
我非常肯定,无论你想做什么,都可以矢量化,并且不需要任何循环就可以运行。但是,你的代码编写方式,它不工作也就不足为奇了......
如果
k
是(h, w)
形状数组,那么k[i]
是(w,)
形状数组。当您执行i-k[i]
时,numpy将发挥其广播魔力,你会得到一个(w,)
形状的数组,所以你用(w,)
形状的数组和一个整数来索引imgB
。由于索引中的一个项是数组,因此需要创建奇特的索引。因此,假设imgB
也具有(h, w, 1)
形状,则imgB[i-k[i], j]
的返回值将不是(1,)
形状的数组,而是一个(w, 1)
形状的数组,当你试着从imgA[i, j]
中减去它时,它是一个(1,)
形状的数组,广播魔术又起作用了,所以你得到了一个(w, 1)
形状的数组。我们不知道
final
是什么,但如果它是(h, w, 1)
形状的数组,如imgA
和imgB
,那么final[i][j]
是(1,)
形状的数组,而您试图给它指定一个(w, 1)
形状的数组,但这个数组不适合,因此出现operand requires a reduction,but reduction is not enabled
错误消息。您实际上不需要拆分阵列来计算Δ E ...
我仍然不明白您在第二种情况下要做什么......如果您要比较沿x轴位移的两个图像,我建议使用
np.roll
:在位置
(r, c)
处,imgLabL
的像素(r, c)
和imgLAbR
的像素(r - k, c)
之间的deltaE,这是你想要的吗?fruv7luv2#
我通常使用
numpy.nditer
,它的文档是here,并且有很多例子。也可以使用c风格的迭代,即
如果你需要访问数组的索引,在你的情况下,我会把你的两张图片压缩在一起,创建一个形状为
[2,h,w]
的数组,然后迭代这个数组,用计算结果填充一个空数组。