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

jjjwad0x  于 2023-01-05  发布在  Python
关注(0)|答案(2)|浏览(148)

嘿!我有两个图像(相同的维度)作为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)中的像素加起来
你还知道我的问题吗

tpgth1q7

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)形状的数组,如imgAimgB,那么final[i][j](1,)形状的数组,而您试图给它指定一个(w, 1)形状的数组,但这个数组不适合,因此出现operand requires a reduction,but reduction is not enabled错误消息。

    • 编辑**

您实际上不需要拆分阵列来计算Δ E ...

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

delta = deltaE(imgLabL, imgLabR)

我仍然不明白您在第二种情况下要做什么......如果您要比较沿x轴位移的两个图像,我建议使用np.roll

deltaE(imgLabL, np.roll(imgLabR, k, axis=0))

在位置(r, c)处,imgLabL的像素(r, c)imgLAbR的像素(r - k, c)之间的deltaE,这是你想要的吗?

fruv7luv

fruv7luv2#

我通常使用numpy.nditer,它的文档是here,并且有很多例子。

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]的数组,然后迭代这个数组,用计算结果填充一个空数组。

相关问题