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

下面的代码采用 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 object


由于下面的响应,工作原理的较短代码是这样的:-


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使用列表理解?


拉丁的传说
浏览 142回答 1
1回答

阿波罗的战车

您正在运行一个循环来创建一个列表,但您真的只想要 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_imgfrom cv2from collections import defaultdictrgb_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,防止调用:cvtColorfrom cv2from collections import defaultdictbgr_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
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python