我有两个numpy数组dtype=np.uint8- 像这样:
img1=np.uint8(np.random.randint(0, 255, (480, 640)))
img2=np.uint8(np.random.randint(0, 255, (480, 640)))
Run Code Online (Sandbox Code Playgroud)
我想建立这些数组的积极差异.
这是我的前两个approches(以及第三个用于参考):
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)
Run Code Online (Sandbox Code Playgroud)
我得到了这些执行时间(以及要检查的总和,如果它们相等):
  10x: 1893.54 ms  np.sum=26122208
1000x:  411.71 ms  np.sum=26122208
1000x:   26.60 ms  np.sum=39123624
Run Code Online (Sandbox Code Playgroud)
有没有办法像V2那样更快地获得正确的结果?
这里有一种方法明显快于V2:take img1-img2,并乘以1或-1,具体取决于img1>img2.以下是它的实现方式:
def differenceImageV6(img1, img2):
  a = img1-img2
  b = np.uint8(img1<img2) * 254 + 1
  return a * b
Run Code Online (Sandbox Code Playgroud)
用于测试性能的测试工具:
import numpy as np
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.abs(np.int16(img1)-img2)))
def differenceImageV3(img1, img2):  # fast - but wrong result
  return(img1-img2)
def differenceImageV4(img1, img2):
  return np.where(img1>img2, img1-img2, img2-img1)
def differenceImageV5(img1, img2):
  a = img1-img2
  b = img2-img1
  c = img1>img2
  return a*c + b*(~c)
def differenceImageV6(img1, img2):
  a = img1-img2
  b = np.uint8(img1<img2) * 254 + 1
  return a * b
import timeit
def testit():
  for fn in [differenceImageV2, differenceImageV3, differenceImageV4, differenceImageV5, differenceImageV6]:
    print fn.__name__, np.sum(fn(img1, img2).astype('int64')),
    print timeit.timeit("%s(img1, img2)" % fn.__name__, "from test import img1, img2, %s" % fn.__name__, number=1000)
if __name__ == '__main__':
    testit()
Run Code Online (Sandbox Code Playgroud)
由此产生的性能数字:
differenceImageV2 26071358 0.982538938522
differenceImageV3 39207702 0.0261280536652
differenceImageV4 26071358 1.36270809174
differenceImageV5 26071358 0.220561981201
differenceImageV6 26071358 0.154536962509
Run Code Online (Sandbox Code Playgroud)
differenceImageV6比不正确的慢6倍differenceImageV3,但仍比前一个最好快6倍differenceImageV2.differenceImageV1未经测试,因为它比其他部分容易慢几个数量级.
注意:我包括了np.where一种比较方法; 我认为它可能有很好的表现但事实证明它相当差.似乎在NumPy中通过布尔数组执行切片非常慢.
如果你opencv有空,你也可以使用:
def differenceImageV4(img1, img2):
  return cv2.absdiff(img1, img2)
Run Code Online (Sandbox Code Playgroud)
这几乎与differenceImageV3.
|   归档时间:  |  
           
  |  
        
|   查看次数:  |  
           2587 次  |  
        
|   最近记录:  |