python - 比较数组时,为什么 "in1d"比 "a==b"慢得多

标签 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 数组的了解有限,我看不到为此目的实现它的方法。)

最佳答案

np.in1d在最坏的情况下检查其第一个参数的每个元素与其第二个元素的每个元素。对于每个元素 i,jimg它检查是否有元素 k,limg2具有相同的值。这意味着您的 640x480你最终可以做的图像(640x480)^2比较。

另一方面,==仅按元素检查,它检查元素是否为 i,jimg等于元素 i,jimg2 .它总是有 640x480比较。

np.in1d如果您有不同尺寸的图像,将会起作用,==仅适用于相同尺寸的图像。

关于python - 比较数组时,为什么 "in1d"比 "a==b"慢得多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31864160/

相关文章:

python - Python中使用默认值的多列表迭代

java - 编写返回数组后半部分的方法 secondaryHalf。不能使用快捷方式,只能使用for循环

Java 添加到 ArrayList<String> 然后转换为 Object[][]

来自特征点的 OpenCV 外部相机

.net - 如何在灰色位图图像上绘制彩色形状?

Python - 插入列表

python - pandas read_csv 将所有值放在一列和一行中

python - python中Pandas.DataFrame中特定列的最常见模式

java - 循环并写入数组

java - Android 分水岭 OpenCV