HY! 我有两个图像(相同的维度)作为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有没有办法做到这一点?
感谢
编辑 我试着更好地解释自己。 我在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)。 所以现在我需要一个新的delta但是x轴不同,就像imgRl(0,0)中的像素一样,我想在imgLl(0 + k,0)中添加像素
你有更多我的问题吗?
答案 0 :(得分:1)
我很确定无论你想要做什么,都可以进行矢量化并在没有任何循环的情况下运行。但是编写代码的方式,它不起作用就不足为奇了......
如果k
是形状(h, w)
的数组,则k[i]
是形状(w,)
的数组。当你做i-k[i]
时,numpy会做它的广播魔术,你会得到一个形状(w,)
的数组。因此,您使用形状imgB
的数组和单个整数为(w,)
编制索引。由于索引中的某个项目是数组,fancy indexing会启动。因此假设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
错误消息。
修改强>
您实际上不需要拆分数组来计算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)
位于(r, c)
的像素imgLabL
和(r - k, c)
的像素imgLAbR
之间的deltaE。这就是你想要的吗?
答案 1 :(得分:0)
我通常使用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]
的数组,然后迭代它,用计算结果填充一个空数组。