Более быстрый способ найти распределения цветового диапазона в изображении?

#python #opencv

#python #opencv

Вопрос:

Цель состоит в том, чтобы находить и нацеливать капли разных цветов. На данный момент это будет сделано на одном ядре. Это большое изображение, например, 5 миллионов пикселей. Это глупый способ сделать это и очень медленный, «но он работает», например. для запуска требуется 5 минут, что явно не практично. Весь смысл в том, что я не знаю цвета заранее, поэтому я не могу просто ввести диапазон масок.

 import cv2

image = cv2.imread('./image.jpg')
image_width = len(image)
image_height = len(image[0])

hsv_groups = {}

for x in range(image_width):
  for y in range(image_height):
    hsv_str_key = str(image[x][y])
    if hsv_str_key in hsv_groups:
      hsv_groups[hsv_str_key]   = 1
    else:
      hsv_groups[hsv_str_key] = 1

# to see distribution, can sort
print(json.dumps(hsv_groups))
 

После нахождения самых высоких значений HSV я бы использовал их для применения к изображениям, а затем обработал полученные области (большие двоичные объекты).

Возможно, я ошибаюсь относительно того, какое значение содержится, например, в результате изображения. [val, val, val] , они могут быть RGB, так как вы обычно делаете это для преобразования в HSV перед применением маски.

Одним из улучшений является просто прямое сравнение массивов, которое, похоже, работает. И проверка того, находится ли массив (даже 1×3) в родительском массиве, работает. Я полагаю, что идеальным решением, вероятно, является использование numpy в сочетании с прямым запуском c / cython… хотя сама итерация была довольно быстрой.

Комментарии:

1. Если вам просто нужна гистограмма, используйте функции opencv, numpy или scikit-image histogram.

2. ха-ха, вот что означает гистограмма, в любом случае я проверю это / почитаю об этом. Похоже, тогда очень легко получить максимальное количество цветов. Спасибо

3. Да! Гистограмма — это просто способ хранения подсчетов каждого значения.