我想對opencv cv2圖像執行多色閾值處理。我想解決的問題是以下幾點:OpenCV多色閾值處理
- R,G,B各有一個「有效」列表
- 如果像素的R,G,B都認爲是有效的,然後進行像素(0, 0,0),否則,使其(255,255,255)
例如
- [221,180,50]被認爲是R通道有效
- [23,18 ,2]在G中被認爲是有效的信道
- [84,22,48]被認爲是B通道
然後有效如果像素具有任何以下值(RGB排列)
- (221,23,84) 的
- (221,23,22)
- (221,23,48)
- (221,18,84)
- (221,18,22)
- (221,18,48)
- ...
- (50,2,48)
它將轉化爲(0,0,0),否則(255,255,255)
目前,我具有嵌套這樣做的for循環:
for x in range(width):
for y in range(height):
imcv[y, x] = threshold(imcv[y, x])
其中threshold
功能執行上面描述的邏輯。請注意,雖然我是在原地進行此操作,但不需要就地轉換。
我目前使用的方法有效,但速度很慢。我相信在OpenCV/Numpy中必須有更好的方法。我對這兩個框架都很陌生,無法弄清楚。
我研究了OpenCV閾值函數,看起來它們只能工作在單通道灰度圖像上,範圍也需要是連續的範圍。我需要的是在離散值上對所有3個通道進行閾值處理。我想有需要傳遞一個自定義函數,但我無法在他們的文檔中找到正確的API。
我也查找了可能使用的numpy API,比如ufunc
。看來我無法實現我在這裏使用它的目的,或者我沒有看到如何。
任何幫助表示讚賞。
編輯:
由於雙方AbidRahmanK和HYRY,既解決方案不是性能X1500改良實現了。
ncalls tottime percall cumtime percall filename:lineno(function)
1 1.576 1.576 1.576 1.576 test.py:48(preprocess_cv2_image)
1 0.000 0.000 0.001 0.001 test.py:79(preprocess_cv2_image3)
1 0.000 0.000 0.001 0.001 test.py:66(preprocess_cv2_image2)
首先,使用'xrange'而不是'range'。後者實際上會建立一個指定大小的完整列表,然後迭代它,而前者返回一個生成器,它不必預先計算整個列表並允許您迭代它。 –
嗨@SchighSchagh,謝謝你的建議。使用'range'的C實現肯定有幫助。我認爲我的瓶頸在於訪問和更改python中的每個像素。我認爲如果有一個API允許我將它推入C實現numpy或opencv將大大加速它。 – xbtsw
是[221,18,48]也有效嗎? –