找到两个图像的像素差异时的IndexError

时间:2016-04-06 17:12:10

标签: python opencv numpy

以下是使用python中的opencv查找相同大小的两个图像的像素差异的代码。但是,它在最后一行给我一个错误,我不知道如何解决它。

if h1==h2:
    if w1==w2:
        c=np.zeros((h1,w1,3),np.uint8)
        for i in range(img1.shape[0]):
            for j in range(img1.shape[1]):
                c[j][i]=img1[j][i]-img2[j][i]
  

IndexError:索引480超出了轴0,大小为480

1 个答案:

答案 0 :(得分:1)

你混淆了指数; i属于img1.shape[0]

img1[j][i]-img2[j][i]

那就是说,numpy可以为你提供这个过程,你可以简单地做

if img1.shape == img2.shape:
    c = img1 - img2

但是,您必须小心数据类型。如果一个图像中的像素为0而另一个图像中的像素为32?

,该怎么办?
>>> np.uint8(0) - np.uint8(32)

Warning (from warnings module):
  File "__main__", line 2
RuntimeWarning: overflow encountered in ubyte_scalars
224

你想将它们转换为整数以获得差异,如果你想保持0-255范围内的差异,你可以采用绝对值。

c = img1.astype(int) - img2.astype(int)
# you can optionally do the following depending on what you want to do next
c = np.abs(c).astype(np.uint8)

OpenCV表示能够实现所有这些功能的功能cv2.absdiff()

c = cv2.absdiff(img1, img2)