質問編集履歴

3

コードの添付ミスを修正

2023/03/07 06:20

投稿

k5kkkkk
k5kkkkk

スコア102

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 の追加

2023/03/07 06:09

投稿

k5kkkkk
k5kkkkk

スコア102

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
- ベンチには含んでいませんが、1pixずつ計算するよりはpythonでLUTを実装したほうが速いです
73
+ numpyの array indexing ? を使用することで、openCVに迫ることが出来ました
74
+ こちらであれば8bpc以外の画像も処理可能です

1

8bpc版ベンチマーク を追加

2023/03/07 05:18

投稿

k5kkkkk
k5kkkkk

スコア102

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を実装したほうが速いです