Приведенный ниже код берет изображение 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, использующий понимание списка?