gpt4 book ai didi

python - 用整数替换 numpy 数组中的 RGB 值非常慢

转载 作者:太空宇宙 更新时间:2023-11-03 12:38:39 24 4
gpt4 key购买 nike

我想将 numpy 数组的 rgb 值替换为单个整数表示。我的代码有效,但它太慢了,我现在正在遍历每个元素。我可以加快速度吗?我是 numpy 的新手。

from skimage import io

# dictionary of color codes for my rgb values
_color_codes = {
(255, 200, 100): 1,
(223, 219, 212): 2,
...
}

# get the corresponding color code for the rgb vector supplied
def replace_rgb_val(rgb_v):
rgb_triple = (rgb_v[0], rgb_v[1], rgb_v[2])
if rgb_triple in _color_codes:
return _color_codes[rgb_triple]
else:
return -1

# function to replace, this is where I iterate
def img_array_to_single_val(arr):
return np.array([[replace_rgb_val(arr[i][j]) for j in range(arr.shape[1])] for i in range(arr.shape[0])])


# my images are square so the shape of the array is (n,n,3)
# I want to change the arrays to (n,n,1)
img_arr = io.imread(filename)
# this takes from ~5-10 seconds, too slow!
result = img_array_to_single_val(img_arr)

最佳答案

以相反的方式替换颜色值。查找每个 RGB 三元组,并在新数组中设置相应的索引:

def img_array_to_single_val(arr, color_codes):
result = numpy.ndarray(shape=arr.shape[:2], dtype=int)
result[:,:] = -1
for rgb, idx in color_codes.items():
result[(arr==rgb).all(2)] = idx
return result

让我们把颜色索引分配分开:首先 arr==rgb 将每个像素 rgb 值与列表 rgb 进行比较,得到一个 n x n x 3 - bool 数组.只有当所有三个颜色部分都相同时,我们才能找到匹配项,因此 .all(2) 减少最后一个轴,导致 n x n - bool 数组,True对于匹配 rgb 的每个像素。最后一步是,使用此掩码设置相应像素的索引。

可能更快,首先将 RGB 数组转换为 int32,然后进行索引转换:

def img_array_to_single_val(image, color_codes):
image = image.dot(numpy.array([65536, 256, 1], dtype='int32'))
result = numpy.ndarray(shape=image.shape, dtype=int)
result[:,:] = -1
for rgb, idx in color_codes.items():
rgb = rgb[0] * 65536 + rgb[1] * 256 + rgb[2]
result[arr==rgb] = idx
return result

对于非常大或很多的图像,您应该首先创建直接颜色映射:

color_map = numpy.ndarray(shape=(256*256*256), dtype='int32')
color_map[:] = -1
for rgb, idx in color_codes.items():
rgb = rgb[0] * 65536 + rgb[1] * 256 + rgb[2]
color_map[rgb] = idx

def img_array_to_single_val(image, color_map):
image = image.dot(numpy.array([65536, 256, 1], dtype='int32'))
return color_map[image]

关于python - 用整数替换 numpy 数组中的 RGB 值非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33196130/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com