我有一个RGBA值数组,如下所示:

# Not all elements are [0, 0, 0, 0]
array([[0, 0, 0, 0],
       [0, 0, 0, 0],
       [0, 0, 0, 0],
       ...,
       [0, 0, 0, 0],
       [0, 0, 0, 0],
       [0, 0, 0, 0]])

我还有一个函数,它返回与某个RGBA值最接近的5个值之一(绿色、红色、橙色、棕色、白色).

def closest_colour(requested_colour):
    min_colours = {}
    for key, name in webcolors.CSS3_HEX_TO_NAMES.items():
        if name in ['green', 'red', 'orange', 'brown', 'white']:
            r_c, g_c, b_c = webcolors.hex_to_rgb(key)
            rd = (r_c - requested_colour[0]) ** 2
            gd = (g_c - requested_colour[1]) ** 2
            bd = (b_c - requested_colour[2]) ** 2
            min_colours[(rd + gd + bd)] = name
    return min_colours[min(min_colours.keys())]

我想将此函数应用于我的NumPy数组的每个元素,并更改这些元素.我试着这样做:

img_array[closest_colour(img_array) == 'green'] = (0, 255, 0, 1)
img_array[closest_colour(img_array) == 'red'] = (255, 0, 0, 1)
img_array[closest_colour(img_array) == 'brown'] = (92, 64, 51, 1)
img_array[closest_colour(img_array) == 'orange'] = (255, 165, 0, 1)
img_array[closest_colour(img_array) == 'white'] = (255, 255, 255, 0)

但我得到了一个错误:

TypeError: unhashable type: 'numpy.ndarray'

我知道为什么会发生这个错误,但我也不知道有什么不同的方法可以有效地做到这一点.

在我处理相当大的数组(图像)时,有没有一种方法可以有效地做到这一点?

推荐答案

您可以使用numpy.apply_along_axis:

np.apply_along_axis(closest_colour, axis=1, arr=img_array)

如果您只想用新值替换这些值,那么让您的函数返回这些新值.

Python相关问答推荐

Polars:用氨纶的其他部分替换氨纶的部分

如何使用Python以编程方式判断和检索Angular网站的动态内容?

如何设置视频语言时上传到YouTube与Python API客户端

根据列值添加时区

如何使Matplotlib标题以图形为中心,而图例框则以图形为中心

如何从需要点击/切换的网页中提取表格?

在两极中过滤

考虑到同一天和前2天的前2个数值,如何估算电力时间序列数据中的缺失值?

Tkinter菜单自发添加额外项目

使用Python从rotowire中抓取MLB每日阵容

具有相同图例 colored颜色 和标签的堆叠子图

Flask运行时无法在Python中打印到控制台

当我定义一个继承的类时,我可以避免使用`metaclass=`吗?

随机森林n_估计器的计算

Pandas 删除只有一种类型的值的行,重复或不重复

按最大属性值Django对对象进行排序

根据两个lambda条件筛选组并根据条件创建新列的最佳方式是什么?

`Convert_time_zone`函数用于根据为极点中的每一行指定的时区检索值

为什么fizzbuzz在两个数字的条件出现在一个数字的条件之后时不起作用?

使用pytest测试是否缺少导入