我需要能够比较两个图像并提取任何唯一像素以创建第三个图像。为此,我做了以下几点:
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数组的了解有限,我无法找到实现此目的的方法。)
答案 0 :(得分:5)
np.in1d
检查其第一个参数的每个元素对其第二个元素的每个元素。对于i,j
中的每个元素img
,它会检查k,l
中的元素img2
是否具有相同的值。这意味着对于640x480
图片,您最终可以进行(640x480)^2
比较。
另一方面,==
仅检查元素,它检查i,j
的元素img
是否等于i,j
的元素img2
。它将始终进行640x480
次比较。
np.in1d
将有效,==
仅适用于相同尺寸的图片。