Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 列出opencv bgr对调色板十六进制装箱的理解。TypeError:无法解压缩不可编辑的numpy.uint8对象_Python_Opencv_Hex_List Comprehension_Rgb - Fatal编程技术网

Python 列出opencv bgr对调色板十六进制装箱的理解。TypeError:无法解压缩不可编辑的numpy.uint8对象

Python 列出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

下面的代码获取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]、[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:不允许使用空表达式