为了账号安全,请及时绑定邮箱和手机立即绑定

列表理解 opencv bgr 到十六进制装箱的调色板。

列表理解 opencv bgr 到十六进制装箱的调色板。

拉丁的传说 2022-09-06 16:52:34
下面的代码采用 opencv 图像,将其转换为 rgb,然后使用列表理解逐步完成将它们转换为十六进制的像素,并计算每种颜色的像素数。如何使用列表理解来减少此代码,并解决底部的TypeError?import cv2bgr_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 object由于下面的响应,工作原理的较短代码是这样的:-import cv2bgr_img = cv2.imread(img_input)rgb_img = cv2.cvtColor(bgr_img, cv2.COLOR_BGR2RGB) # Hex starts with Redpalette = 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使用列表理解?
查看完整描述

1 回答

?
阿波罗的战车

TA贡献1862条经验 获得超6个赞

您正在运行一个循环来创建一个列表,但您真的只想要 for :jcolour_hexcolour_hexj


替换此:


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

有了这个:


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

如果你不需要其他任何东西,并期望许多不同的颜色,我更喜欢这个更短,也许更Pythonic的解决方案:bgr_img


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


查看完整回答
反对 回复 2022-09-06
  • 1 回答
  • 0 关注
  • 141 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号