3

嗨!我有两个图像(相同的维度)作为 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 数组 ,但它不适用于图像,我得到错误:解包的值太多有没有办法用 numpy 和 python 2.7 做到这一点?

谢谢

编辑我试图更好地解释自己。我在 LAB 颜色空间中有 2 张图像。这些图像是 (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 的数组(288,384)。所以现在我需要一个新的增量但具有不同的 x 轴,就像 imgRl(0,0) 中的像素我想在 imgLl(0+k,0) 中添加像素

你有更多我的问题吗?

4

2 回答 2

2

我很确定,无论您尝试做什么,都可以进行矢量化并在其中没有任何循环的情况下运行。但是您的代码编写方式,它不起作用也就不足为奇了......

如果k是一个形状数组(h, w),那么k[i]就是一个形状数组(w,)。当你这样做时i-k[i],numpy 会发挥它的广播魔法,你会得到一个 shape 数组(w,)imgB因此,您正在使用形状数组(w,)和单个整数进行索引。因为索引中的一个项目是一个数组,所以花哨的索引开始了。所以假设imgB也有 shape (h, w, 1),返回值imgB[i-k[i], j]将不是一个 shape 数组(1,),而是一个 shape 数组(w, 1)。当你尝试从 中减去它时imgA[i, j],它是一个 shape 数组(1,),广播魔法再次起作用,所以你得到一个 shape 数组(w, 1)

我们不知道是什么final。但是,如果它是一个 shape 数组(h, w, 1),asimgAimgB,那么final[i][j]就是一个 shape 数组(1,),而您正试图为其分配一个 shape 数组(w, 1),但它不适合。因此出现operand requires a reduction,but reduction is not enabled错误消息。

编辑

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

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)之间具有 deltaE 的位置。那是你要的吗?(r, c)imgLabL(r - k, c)imgLAbR

于 2012-12-13T17:44:36.217 回答
1

我通常使用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]然后对其进行迭代,用计算结果填充一个空数组。

于 2012-12-13T19:07:19.003 回答