Я пытаюсь сделать многоцветное пороговое значение на изображении opvv 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 x in range(width):
for y in range(height):
imcv[y, x] = threshold(imcv[y, x])
где threshold
функция выполнения логики, описанной выше. Обратите внимание, что, хотя я сделал это на месте, преобразование на месте не требуется.
Метод, который я использую в настоящее время, но очень медленный. Я считаю, что в OpenCV/Numpy должен быть лучший метод. Я очень новичок в обеих рамках и не могу понять, как это сделать.
Я исследовал функции пороговых значений OpenCV, кажется, что они могут работать только на одноканальном изображении с серой шкалой, а диапазон должен быть последовательным. То, что мне нужно, - это пороговое значение для всех трех каналов по дискретным значениям. Я предполагаю, что должна быть специальная функция для передачи, но я не могу найти правильный API в своих документах.
Я также искал возможно многомерный API, который мог бы использовать, например ufunc
. Кажется, я не могу достичь того, что я хотел здесь использовать, или я не видел, как это сделать.
Любая помощь приветствуется.
EDIT:
Благодаря как 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, спасибо за ваше предложение. Использование C реализации 'range' определенно помогает. Я думаю, что мое узкое место здесь доступно и меняет каждый пиксель в python. Я думаю, что если есть api, позвольте мне нажать его на реализацию C numpy или opencv, это ускорит ее. – xbtsw
is [221,18,48] также действителен? –