数日前、私は新しいOpenCV-Pythonインターフェースcv2
を使い始めました。
私の質問は、cv
とcv2
インターフェースの比較に関するものです。
使いやすさに関しては、新しいcv2
インターフェースが大幅に改善され、cv2
を操作するのは本当に簡単で楽しいです。
しかし、速度はどうですか?
パフォーマンスを確認するために、1つはcv
に、もう1つはcv2
に2つの小さなコードスニペットを作成しました。どちらも同じ機能を果たし、画像のピクセルにアクセスし、テストし、いくつかの変更を加えます。
以下はコードです:
cv2 interface
:
import time
import numpy as np
import cv2
gray = cv2.imread('sir.jpg',0)
width = gray.shape[0]
height = gray.shape[1]
h = np.empty([width,height,3])
t = time.time()
for i in xrange(width):
for j in xrange(height):
if gray[i,j]==127:
h[i,j]=[255,255,255]
Elif gray[i,j]>127:
h[i,j]=[0,0,255-gray[i,j]]
else:
h[i,j]=[gray[i,j],0,0]
t2 = time.time()-t
print "time taken = ",t2
================================================== ===
そして結果は次のとおりです。
所要時間= 14.4029130936
================================================== ====
cv interface:
import cv,time
gray = cv.LoadImage('sir.jpg',0)
h = cv.CreateImage(cv.GetSize(gray),8,3)
t=time.time()
for i in xrange(gray.width):
for j in xrange(gray.height):
k = cv.Get2D(gray,j,i)[0]
if k==127:
cv.Set2D(h,j,i,(255,255,255))
Elif k>127:
cv.Set2D(h,j,i,(0,0,255-k))
else:
cv.Set2D(h,j,i,(k,0,0))
t2 = time.time()-t
print "time taken = ",t2
cv.ShowImage('img',h)
cv.WaitKey(0)
================================================== ====
結果は次のとおりです。
所要時間= 1.16368889809
================================================== =====
ここで、古いcv
は12 times faster
よりもcv2
についてです。そして、結果の画像は同じです。 (入力画像のサイズは720x540です)
なぜこれが起こるのですか?
Cv2はcvと比較して遅いですか?
それとも私はここで何か間違いを犯していますか?上記のコードのcv2に高速な方法はありますか?
Cv2.imread()によって返される画像は、NumPyの配列オブジェクトです。したがって、NumPyの関数を使用して計算を高速化できます。
次のプログラムは、ndarrayオブジェクトのitem()、itemset()メソッドを使用して、Originのforループバージョンを高速化する方法を示しています。
import time
import numpy as np
import cv2
gray = cv2.imread('lena_full.jpg',0)
height, width = gray.shape
h = np.empty((height,width,3), np.uint8)
t = time.time()
for i in xrange(height):
for j in xrange(width):
k = gray.item(i, j)
if k == 127:
h.itemset(i, j, 0, 255)
h.itemset(i, j, 1, 255)
h.itemset(i, j, 2, 255)
Elif k > 127:
h.itemset(i, j, 0, 0)
h.itemset(i, j, 1, 0)
h.itemset(i, j, 2, 255-k)
else:
h.itemset(i, j, 0, k)
h.itemset(i, j, 1, 0)
h.itemset(i, j, 2, 0)
print time.time()-t
そして、次のプログラムは、最初にパレットを作成し、NumPyの配列インデックスを使用して結果を取得する方法を示しています。
t = time.time()
palette = []
for i in xrange(256):
if i == 127:
palette.append((255, 255, 255))
Elif i > 127:
palette.append((0,0,255-i))
else:
palette.append((i, 0, 0))
palette = np.array(palette, np.uint8)
h2 = palette[gray]
print time.time() - t
print np.all(h==h2)
出力は次のとおりです。
0.453000068665
0.0309998989105
True
Cvバージョンの出力は次のとおりです。
0.468999862671
注:軸0の長さは画像の高さ、軸1の長さは画像の幅です