我有两个numpy-arrays与dtype=np.uint8
-像这样:
img1=np.uint8(np.random.randint(0, 255, (480, 640)))
img2=np.uint8(np.random.randint(0, 255, (480, 640)))
字符串
我想建立这些数组的正差值。
以下是我的前两种方法(第三种方法可供参考):
def differenceImageV1(img1, img2):
diff=np.empty_like(img1)
h, w=img1.shape
for y in range(h):
for x in range(w):
if img1[y, x]<img2[y, x]: diff[y, x]=img2[y, x]-img1[y, x]
else: diff[y, x]=img1[y, x]-img2[y, x]
return(diff)
def differenceImageV2(img1, img2):
return(np.uint8(np.absolute(np.int16(img1)-np.int16(img2))))
def differenceImageV3(img1, img2): # fast - but wrong result
return(img1-img2)
型
我得到这些执行时间(以及要检查的总和,如果它们相等):
10x: 1893.54 ms np.sum=26122208
1000x: 411.71 ms np.sum=26122208
1000x: 26.60 ms np.sum=39123624
型
有没有一种方法可以像V2一样更快地获得正确的结果?
3条答案
按热度按时间j2datikz1#
下面是一个比
V2
快得多的方法:取img1-img2
,然后乘以1或-1,具体取决于img1>img2
。以下是它的实现方式:字符串
用于测试性能的测试线束:
型
以及由此产生的性能数字:
型
differenceImageV6
比不正确的differenceImageV3
慢6倍,但仍然比以前最好的differenceImageV2
快6倍。differenceImageV1
没有经过测试,因为它比其他的要慢几个数量级。注意:我包含了一个
np.where
方法用于比较;我以为它可能有很好的性能,但结果是相当差。在NumPy中,通过布尔数组执行切片似乎非常慢。ajsxfq5m2#
如果你有
opencv
可用,你也可以用途:字符串
其速度几乎与
differenceImageV3
相同。v8wbuo2f3#
自从接受答案以来已经有一段时间了,所以仅供参考,我在Python3.10上与OpenCV 4.6.0和Numpy 1.23.0进行了一些比较。OpenCV版本显然上级,运行速度与错误版本(* 编辑:我刚刚意识到这正是Jan Rüegg所指出的,但我误读了函数的编号 *)。而且,int16版本现在和整洁技巧一样快。
字符串
输出量:
型