gpt4 book ai didi

python - 使用 numpy 用调色板中最接近的颜色替换图像中的颜色

转载 作者:行者123 更新时间:2023-12-05 01:05:13 27 4
gpt4 key购买 nike

我有一个颜色列表,我有一个函数closest_color(pixel, colors),它将给定像素的RGB值与我的颜色列表进行比较,并输出列表中最接近的颜色。

我需要将此功能应用于整个图像。当我尝试逐个像素地使用它时(通过使用 2 个嵌套的 for 循环)它很慢。有没有更好的方法来使用 numpy 实现这一点?

最佳答案

任务是将图片变成它的调色板版本。您定义了一个调色板,然后您需要为每个像素在定义的调色板中为该像素的颜色找到最近邻匹配。您从该查找中获得一个索引,然后您可以将其转换为该像素的调色板颜色。

这可以使用 FLANN(OpenCV 附带)来实现。代码也不多。在我的旧电脑上查找需要两秒钟。

这种方法的一个优点是它可以处理“大”调色板而不需要大量内存。然而,这并不是 FLANN 独有的。 FLANN 的独特之处可能在于它需要多少(用户端)代码。

缺点:这仍然需要几秒钟。

FLANN 使用索引结构,可以处理任意向量,它使用 float32 类型。由于 FLANN 中的索引结构,它执行亚线性(可能是 O(log(n)) 或 sth.),即优于“线性扫描”(O(n) )。然而,一旦调色板变得巨大,FLANN 的复杂性和通用性的成本只会被更好的查找复杂性分摊。 “线性扫描”,带有特定于这个问题的代码,我在另一个答案中使用 numba

完整笔记本:https://gist.github.com/crackwitz/bbb1aff9b7c6c744665715a5337192c0

# set up FLANN
# somewhat arbitrary parameters because under-documented
norm = cv.NORM_L2
FLANN_INDEX_KDTREE = 1
index_params = dict(algorithm=FLANN_INDEX_KDTREE, trees=5)
search_params = dict(checks=50)
fm = cv.FlannBasedMatcher(index_params, search_params)

# make up a palette and give it to FLANN
levels = (0, 64, 128, 192, 255)
palette = np.uint8([
[b,g,r]
for b in levels
for g in levels
for r in levels
])
print("palette size:", len(palette))
fm.add(np.float32([palette])) # extra dimension is "pictures", unused
fm.train()

# find nearest neighbor matches for all pixels
queries = im.reshape((-1, 3)).astype(np.float32)
matches = fm.match(queries)

# get match indices and distances
assert len(palette) <= 256
indices = np.uint8([m.trainIdx for m in matches]).reshape(height, width)
dist = np.float32([m.distance for m in matches]).reshape(height, width)

# indices to palette colors
output = palette[indices]
# imshow(output)

lena in 125 colors or less

关于python - 使用 numpy 用调色板中最接近的颜色替换图像中的颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70823769/

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