Сумма вхождения значений цвета (оттенка) (0-359) из набора изображений - PullRequest
0 голосов
/ 29 января 2019

У меня есть папка, полная изображений, и я хочу найти значения оттенков с наименьшим появлением.Для этого я создаю массив длиной 360 для всех значений оттенка, беру все изображения в моей папке, просматриваю его и для каждого пикселя добавляю +1 в свой массив в индексе, который представляет значение оттенка.Если у меня есть, например, значение оттенка 0 в моем пикселе, я добавляю +1 в моем массиве с индексом 0. Мой вопрос: есть ли более быстрый или более эффективный способ сделать это?

Вот мой код:

path = 'path'
sub_path = 'sub_path'
sumHueOcc = np.zeros((360, 1), dtype=np.uint64)

for item in dirs:
    fullpath = os.path.join(path,item)
    pathos = os.path.join(sub_path,item)
    if os.path.isfile(fullpath):
        f, e = os.path.splitext(pathos)
        img = np.array(Image.open(fullpath))
        img = np.float32(img)     
        imgHSV = cv2.cvtColor(img, cv2.COLOR_RGB2HSV_FULL) #RGB because numpy RGB

        # want to work with hue only
        h, s, v = cv2.split(imgHSV)

        # the hue values in one large array
        Z = np.array(h, copy=True)
        Z = Z.reshape((-1, 1))

        # convert to np.float32
        Z = np.uint64(Z)

        # count each appearence from hue values
        for z in Z:
            sumHueOcc[z] = sumHueOcc[z] + 1


max = np.argmax(sumHueOcc)
min = np.argmin(sumHueOcc)
print("Minimum 1")
print(min)
sumHueOcc[min] += max
min = np.argmin(sumHueOcc)
print("Minimum 2")
print(min)
sumHueOcc[min] += max
min = np.argmin(sumHueOcc)
print("Minimum 3")
print(min)
sumHueOcc[min] += max
min = np.argmin(sumHueOcc)
print("Minimum 4")
print(min)

1 Ответ

0 голосов
/ 29 января 2019

Мы можем использовать np.bincount для подсчета.

Итак, мы инициализируем выходной массив в начале с int64 -

sumHueOcc_out = np.zeros((180, 1), dtype=np.int64) 

Затем внутри циклов,мы заменяем самую внутреннюю часть, включающую петли -

# the hue values in one large array
Z = np.array(h, copy=True)
Z = Z.reshape((-1, 1))

# convert to np.float32
Z = np.uint64(Z)

# count each appearence from hue values
for z in Z:
    sumHueOcc[z] = sumHueOcc[z] + 1

альтернативой bincount -

sumHueOcc_out.flat += np.bincount(h.astype(np.int64).ravel(),minlength=sumHueOcc.size)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...