比较数组时为什么是" in1d"比#34; a == b"

时间:2015-08-06 19:23:28

标签: python arrays opencv numpy

我需要能够比较两个图像并提取任何唯一像素以创建第三个图像。为此,我做了以下几点:

import cv2
import numpy as np

img = cv2.imread("old.jpg")
img2 = cv2.imread("new.jpg")

image2 = cv2.cvtColor(img2, cv2.COLOR_RGB2RGBA)

for (x,y,z), value in np.ndenumerate(img):
    dif = img[x,y,0] == img2[x,y,0] #only checking one color for speed
    diff = str(dif)
    if "True" in diff:
        image2[x,y,3] = 0
cv2.imwrite("result.png", image2)        

这个效果相当不错,但640 x 480的图片花费了大约10秒钟,我希望能让它接近大约一半的时间。所以我改变了这一行:

dif = img[x,y,0] == img2[x,y,0]

dif = np.in1d(img[x,y,0], img2[x,y,0])

结果是相同的,但现在大约需要3分钟,而不是加快速度。我完全失去了原因。

我意识到迭代大数组中的元素在python中会很费时但是为什么in1d这么慢?

(作为旁注,我会使用" palette method"但由于我对numpy数组的了解有限,我无法找到实现此目的的方法。)

1 个答案:

答案 0 :(得分:5)

在最坏的情况下,

np.in1d检查其第一个参数的每个元素对其第二个元素的每个元素。对于i,j中的每个元素img,它会检查k,l中的元素img2是否具有相同的值。这意味着对于640x480图片,您最终可以进行(640x480)^2比较。

另一方面,==仅检查元素,它检查i,j的元素img是否等于i,j的元素img2。它将始终进行640x480次比较。

如果您有不同尺寸的图片,

np.in1d将有效,==仅适用于相同尺寸的图片。