質問編集履歴
3
コードの添付ミスを修正
test
CHANGED
File without changes
|
test
CHANGED
@@ -58,6 +58,13 @@
|
|
58
58
|
by_np_array_indexing,
|
59
59
|
]
|
60
60
|
|
61
|
+
for func in funcs:
|
62
|
+
t0 = time.time()
|
63
|
+
for i in range(10):
|
64
|
+
res = func(src,dst,lut_np)
|
65
|
+
print(func.__name__,(time.time()-t0)/10)
|
66
|
+
assert np.all(res==exp_val),"error"
|
67
|
+
|
61
68
|
|
62
69
|
```
|
63
70
|
|
2
array indexing の追加
test
CHANGED
File without changes
|
test
CHANGED
@@ -45,6 +45,9 @@
|
|
45
45
|
tmp[i]=lut_np[pix]
|
46
46
|
return tmp.reshape([HEIGHT,WIDTH])
|
47
47
|
|
48
|
+
def by_np_array_indexing(src,dst,lut_np):
|
49
|
+
return lut_np[src]
|
50
|
+
|
48
51
|
if __name__ == '__main__':
|
49
52
|
exp_val = by_cv2LUT(src,dst,lut_np)
|
50
53
|
funcs = [
|
@@ -52,14 +55,9 @@
|
|
52
55
|
by_loopD2_np,
|
53
56
|
by_loopD2_list,
|
54
57
|
by_loopD1_np,
|
58
|
+
by_np_array_indexing,
|
55
59
|
]
|
56
60
|
|
57
|
-
for func in funcs:
|
58
|
-
t0 = time.time()
|
59
|
-
for i in range(10):
|
60
|
-
res = func(src,dst,lut_np)
|
61
|
-
print(func.__name__,(time.time()-t0)/10)
|
62
|
-
assert np.all(res==exp_val),"error"
|
63
61
|
|
64
62
|
```
|
65
63
|
|
@@ -68,6 +66,9 @@
|
|
68
66
|
by_loopD2_np 0.40140058994293215
|
69
67
|
by_loopD2_list 0.4011006116867065
|
70
68
|
by_loopD1_np 0.3491004467010498
|
69
|
+
by_np_array_indexing 0.004999876022338867
|
71
70
|
```
|
71
|
+
### 結論
|
72
72
|
やはり openCVのLUTが優位に速いです
|
73
|
-
|
73
|
+
numpyの array indexing ? を使用することで、openCVに迫ることが出来ました
|
74
|
+
こちらであれば8bpc以外の画像も処理可能です
|
1
8bpc版ベンチマーク を追加
test
CHANGED
File without changes
|
test
CHANGED
@@ -9,3 +9,65 @@
|
|
9
9
|
とりあえずPythonの for-loopでpixcel を回して処理していますが、実行速度が遅く困っています
|
10
10
|
Numpy などに代用可能な処理があるのではないかと思うのですが、見つけられずにいます
|
11
11
|
8bpc 以外の画像を扱われる方は、一般にどのような処理を行われているのでしょうか?
|
12
|
+
|
13
|
+
### 8bpc版ベンチマーク
|
14
|
+
稚拙ですがベンチを書いてみました
|
15
|
+
```python
|
16
|
+
import cv2
|
17
|
+
import numpy as np
|
18
|
+
import random,time
|
19
|
+
|
20
|
+
HEIGHT,WIDTH= 1080,1920
|
21
|
+
|
22
|
+
lut_list = [random.randrange(0,2**8) for i in range(2**8)]
|
23
|
+
lut_np = np.array(lut_list,dtype=np.uint8)
|
24
|
+
src = np.empty((HEIGHT,WIDTH),dtype=np.uint8)
|
25
|
+
dst = np.empty((HEIGHT,WIDTH),dtype=np.uint8)
|
26
|
+
|
27
|
+
def by_cv2LUT(src,dst,lut_np):
|
28
|
+
return cv2.LUT(src,lut_np)
|
29
|
+
|
30
|
+
def by_loopD2_np(src,dst,lut_np):
|
31
|
+
for y,line in enumerate(src):
|
32
|
+
for x,pix in enumerate(line):
|
33
|
+
dst[y,x]=lut_np[pix]
|
34
|
+
return dst
|
35
|
+
|
36
|
+
def by_loopD2_list(src,dst,lut_list):
|
37
|
+
for y,line in enumerate(src):
|
38
|
+
for x,pix in enumerate(line):
|
39
|
+
dst[y,x]=lut_list[pix]
|
40
|
+
return dst
|
41
|
+
|
42
|
+
def by_loopD1_np(src,dst,lut_np):
|
43
|
+
tmp = dst.flatten()
|
44
|
+
for i,pix in enumerate(src.flatten()):
|
45
|
+
tmp[i]=lut_np[pix]
|
46
|
+
return tmp.reshape([HEIGHT,WIDTH])
|
47
|
+
|
48
|
+
if __name__ == '__main__':
|
49
|
+
exp_val = by_cv2LUT(src,dst,lut_np)
|
50
|
+
funcs = [
|
51
|
+
by_cv2LUT,
|
52
|
+
by_loopD2_np,
|
53
|
+
by_loopD2_list,
|
54
|
+
by_loopD1_np,
|
55
|
+
]
|
56
|
+
|
57
|
+
for func in funcs:
|
58
|
+
t0 = time.time()
|
59
|
+
for i in range(10):
|
60
|
+
res = func(src,dst,lut_np)
|
61
|
+
print(func.__name__,(time.time()-t0)/10)
|
62
|
+
assert np.all(res==exp_val),"error"
|
63
|
+
|
64
|
+
```
|
65
|
+
|
66
|
+
```
|
67
|
+
by_cv2LUT 0.0005998373031616211
|
68
|
+
by_loopD2_np 0.40140058994293215
|
69
|
+
by_loopD2_list 0.4011006116867065
|
70
|
+
by_loopD1_np 0.3491004467010498
|
71
|
+
```
|
72
|
+
やはり openCVのLUTが優位に速いです
|
73
|
+
ベンチには含んでいませんが、1pixずつ計算するよりはpythonでLUTを実装したほうが速いです
|