Python 列出opencv bgr对调色板十六进制装箱的理解。TypeError:无法解压缩不可编辑的numpy.uint8对象
下面的代码获取opencv图像,将其转换为rgb,并使用列表理解逐步将像素转换为十六进制,并计算每种颜色的像素数 如何使用列表理解减少代码,并解决底部的TypeErrorPython 列出opencv bgr对调色板十六进制装箱的理解。TypeError:无法解压缩不可编辑的numpy.uint8对象,python,opencv,hex,list-comprehension,rgb,Python,Opencv,Hex,List Comprehension,Rgb,下面的代码获取opencv图像,将其转换为rgb,并使用列表理解逐步将像素转换为十六进制,并计算每种颜色的像素数 如何使用列表理解减少代码,并解决底部的TypeError import cv2 bgr_img = cv2.imread(img_input) rgb_img = cv2.cvtColor(bgr_img, cv2.COLOR_BGR2RGB) # Hex starts with Red 该文件的形状(3007003)为[[90150140]、[90150140]、[9015014
import cv2
bgr_img = cv2.imread(img_input)
rgb_img = cv2.cvtColor(bgr_img, cv2.COLOR_BGR2RGB) # Hex starts with Red
该文件的形状(3007003)为[[90150140]、[90150140]、[90150140]、[90150140]
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
这可以缩短吗?/使用列表理解功能使其更具Pythonic?您正在对
j
运行一个循环,以创建colour\u hex
列表,但实际上您只需要colour\u 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\u img
进行任何其他操作,并且希望使用多种不同的颜色,那么我更希望使用这种更短、甚至更具python风格的解决方案:
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
这会导致指向调色板[f“#{:02x}{:02x}{:02x}”的第一个括号的语法错误。format(*j)]+=1语法错误:f-string:不允许使用空表达式