実現したいこと
openCVのcv.LUT()と同等の処理を8bpcではなく16bpcなどで行いたい
前提
openCVのcv.LUT()
のように、src の値から dst の値を一律の方式で変換したいです
この時、srcが dtype=CV_8U
以外では実行できないようで困っています
試したこと
とりあえずPythonの for-loopでpixcel を回して処理していますが、実行速度が遅く困っています
Numpy などに代用可能な処理があるのではないかと思うのですが、見つけられずにいます
8bpc 以外の画像を扱われる方は、一般にどのような処理を行われているのでしょうか?
8bpc版ベンチマーク
稚拙ですがベンチを書いてみました
python
1import cv2 2import numpy as np 3import random,time 4 5HEIGHT,WIDTH= 1080,1920 6 7lut_list = [random.randrange(0,2**8) for i in range(2**8)] 8lut_np = np.array(lut_list,dtype=np.uint8) 9src = np.empty((HEIGHT,WIDTH),dtype=np.uint8) 10dst = np.empty((HEIGHT,WIDTH),dtype=np.uint8) 11 12def by_cv2LUT(src,dst,lut_np): 13 return cv2.LUT(src,lut_np) 14 15def by_loopD2_np(src,dst,lut_np): 16 for y,line in enumerate(src): 17 for x,pix in enumerate(line): 18 dst[y,x]=lut_np[pix] 19 return dst 20 21def by_loopD2_list(src,dst,lut_list): 22 for y,line in enumerate(src): 23 for x,pix in enumerate(line): 24 dst[y,x]=lut_list[pix] 25 return dst 26 27def by_loopD1_np(src,dst,lut_np): 28 tmp = dst.flatten() 29 for i,pix in enumerate(src.flatten()): 30 tmp[i]=lut_np[pix] 31 return tmp.reshape([HEIGHT,WIDTH]) 32 33def by_np_array_indexing(src,dst,lut_np): 34 return lut_np[src] 35 36if __name__ == '__main__': 37 exp_val = by_cv2LUT(src,dst,lut_np) 38 funcs = [ 39 by_cv2LUT, 40 by_loopD2_np, 41 by_loopD2_list, 42 by_loopD1_np, 43 by_np_array_indexing, 44 ] 45 46 for func in funcs: 47 t0 = time.time() 48 for i in range(10): 49 res = func(src,dst,lut_np) 50 print(func.__name__,(time.time()-t0)/10) 51 assert np.all(res==exp_val),"error" 52 53
by_cv2LUT 0.0005998373031616211 by_loopD2_np 0.40140058994293215 by_loopD2_list 0.4011006116867065 by_loopD1_np 0.3491004467010498 by_np_array_indexing 0.004999876022338867
結論
やはり openCVのLUTが優位に速いです
numpyの array indexing ? を使用することで、openCVに迫ることが出来ました
こちらであれば8bpc以外の画像も処理可能です

回答1件
あなたの回答
tips
プレビュー