我需要能够比较两张图片并提取任何独特的像素来创建第三张图片。为此,我做了以下工作:
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 数组的了解有限,我看不到为此目的实现它的方法。)
np.in1d
在最坏的情况下检查其第一个参数的每个元素与其第二个元素的每个元素。对于每个元素 i,j
在 img
它检查是否有元素 k,l
在 img2
具有相同的值。这意味着您的 640x480
你最终可以做的图像(640x480)^2
比较。
另一方面,==
仅按元素检查,它检查元素是否为 i,j
的 img
等于元素 i,j
的 img2
.它总是有 640x480
比较。
np.in1d
如果您有不同尺寸的图像,将会起作用,==
仅适用于相同尺寸的图像。
我是一名优秀的程序员,十分优秀!