понимание списка для opencv bgr в hex binning для цветовой палитры. Ошибка типа: невозможно распаковать не повторяемый объект numpy .uint8 - PullRequest
0 голосов
/ 20 марта 2020

Приведенный ниже код берет изображение opencv, преобразует его в rgb и перебирает пиксели, преобразовывая их в шестнадцатеричные, используя понимание списка, и подсчитывает количество пикселей каждого цвета.

Как можно Я уменьшаю этот код, используя понимание списка, и решаю ошибку TypeError внизу?

import cv2
bgr_img = cv2.imread(img_input)
rgb_img = cv2.cvtColor(bgr_img, cv2.COLOR_BGR2RGB) # Hex starts with Red

Файл имеет форму (300, 700, 3), то есть [[[90, 150, 140], [90 150 140], [90 150 140] ....

palette = dict()
for i in img:
    for j in i:
        colour_hex = [f"#{a:02x}{b:02x}{c:02}" for a,b,c in j]
        if colour_hex in palette:
            palette[colour_hex] +=1
        else:
            palette[colour_hex] = 1

Итак, словарь содержит пары ключей-значений шестнадцатеричного цвета и количество каждого пикселя в изображении этого шестнадцатеричного цвета.

Сообщение об ошибке гласит

TypeError: невозможно распаковать не повторяемый numpy .uint8 объект

Благодаря приведенному ниже ответу более короткий код работает так: -

import cv2
bgr_img = cv2.imread(img_input)
rgb_img = cv2.cvtColor(bgr_img, cv2.COLOR_BGR2RGB) # Hex starts with Red
palette = dict()
for i in img:
    for j in i:
        colour_hex = f"#{:02x}{:02x}{:02x}".format(*j)
        if colour_hex in palette:
            palette[colour_hex] +=1
        else:
            palette[colour_hex] = 1

это можно сделать короче? / more Pythoni c, использующий понимание списка?

1 Ответ

1 голос
/ 20 марта 2020

Вы используете al oop сверх j, чтобы создать список colour_hex, но вы действительно просто хотите colour_hex для j:

Замените это:

colour_hex = [f"#{a:02x}{b:02x}{c:02}" for a,b,c in j]

С этим:

colour_hex = "#{:02x}{:02x}{:02}".format(*j)

Если вам не нужен bgr_img для чего-либо еще и вы ожидаете много разных цветов, я бы предпочел это для более короткого, возможно, большего Pythoni c решение:

from cv2
from collections import defaultdict

rgb_img = cv2.cvtColor(cv2.imread(img_input), cv2.COLOR_BGR2RGB)
palette = defaultdict(int)
for i in rgb_img:
    for j in i:
        palette["#{:02x}{:02x}{:02x}".format(*j)] += 1

С другой стороны, если вам не нужен rgb_img, вы также можете просто напрямую использовать bgr_img, предотвращая вызов cvtColor:

from cv2
from collections import defaultdict

bgr_img = cv2.imread(img_input)
palette = defaultdict(int)
for i in bgr_img :
    for j in i:
        palette["#{2:02x}{1:02x}{0:02x}".format(*j)] += 1
...