PythonにおけるOpenCVの実装方法に関する質問です。
以下のような画素(x,y)を網羅するような2重forループを使用すると非常に遅いです。
(処理そのものは深い意味はないですが、BGRの特定の値に対応して条件分岐を伴って色を変換する想定)
python
1import cv2 2 3img = cv2.imread('./hoge.png') 4 5height, width, _ = img.shape 6 7for x in range(height): 8 for y in range(width): 9 if 0 <= img[x][y][0] < 100: 10 img[x][y][2] = img[x][y][0] 11 elif 100 <= img[x][y][0] < 200: 12 img[x][y][2] = img[x][y][1] 13 else: 14 img[x][y][2] = img[x][y][2] 15 16cv2.imwrite('output1.png', img)
以下のようなforループを使用しない処理を考えましたが、
もう少し良い(直感的な)書き方は出来ないものでしょうか?
layer1~3
を上記のif~elif~else
に対応させて作っておき、
cv2.bitwise_and
のmask
機能を使ってif
の条件に一致する部分だけを合体しています。
python
1import cv2 2import numpy as np 3 4img = cv2.imread('./hoge.png') 5output = np.zeros_like(img) 6 7b,g,r = cv2.split(img) 8 9layer1 = output.copy() 10layer1[:,:,2] = b 11mask1 = cv2.inRange(b, 0, 99) 12 13layer2 = output.copy() 14layer2[:,:,2] = g 15mask2 = cv2.inRange(b, 100, 199) 16 17layer3 = output.copy() 18layer3[:,:,2] = r 19mask3 = cv2.inRange(b, 200, 255) 20 21output[:,:,0] = img[:,:,0] 22output[:,:,1] = img[:,:,1] 23 24output += cv2.bitwise_and(layer1, layer1, mask=mask1) 25output += cv2.bitwise_and(layer2, layer2, mask=mask2) 26output += cv2.bitwise_and(layer3, layer3, mask=mask3) 27 28cv2.imwrite('output2.png', output)
質問は、forを使わずに高速で、出来るだけ可読性が高い書き方は何か、です。
よろしくお願い致します。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/05/27 10:05