相关疑难解决方法(0)

Python PIL - 寻找最近的颜色(圆角颜色)

有一款叫做Roblox的游戏,游戏玩家可以玩游戏,通常是看起来像乐高积木的游戏.

在Roblox中,对于Brick颜色,您可以使用典型的RGB值,但这需要一个在文件大小方面效率不高的附加元素.BrickColor不是使用RGB值,而是文件大小更经济.它使用整数来解释为某种颜色.这就是我的意思: 颜色代码

这是我的代码片段:

import Image
f = raw_input('Image:\n')
im = Image.open(f)
rgb_im = im.convert('RGB')
r, g, b = rgb_im.getpixel((x, y))
Run Code Online (Sandbox Code Playgroud)

在我的程序中,我需要找到最接近RGB值的颜色代码.

这怎么可能实现?

python colors rounding roblox python-imaging-library

5
推荐指数
2
解决办法
5268
查看次数

在Python中将图像中的颜色映射到颜色列表中最接近的成员

我有19种颜色的列表,它是大小的numpy数组(19,3)

colors = np.array([[0, 0, 0], 
[0, 0, 255], 
[255, 0, 0], 
[150, 30, 150], 
[255, 65, 255], 
[150, 80, 0], 
[170, 120, 65], 
[125, 125, 125], 
[255, 255, 0], 
[0, 255, 255], 
[255, 150, 0], 
[255, 225, 120], 
[255, 125, 125], 
[200, 100, 100], 
[0, 255, 0], 
[0, 150, 80], 
[215, 175, 125], 
[220, 180, 210], 
[125, 125, 255]
])
Run Code Online (Sandbox Code Playgroud)

现在,我有一个图像(size的numpy数组(1024,1024,3)),其颜色与上面定义的所有颜色有些接近或相等。但是,我的程序要求图像只能包含上面的颜色,而不能包含附近的颜色,因此我需要将数组中每个像素的颜色转换为19种颜色中最接近的颜色。

我在这里看到了一个仅使用Numpy即可从一组颜色中找到最接近的颜色的函数(效果很好)Python-从给出颜色的列表中查找与某种颜色最接近的颜色

def closest_color(colors,color):
    colors = np.array(colors)
    color = np.array(color)
    distances = np.sqrt(np.sum((colors-color)**2,axis=1)) …
Run Code Online (Sandbox Code Playgroud)

python indexing rgb numpy colors

5
推荐指数
1
解决办法
82
查看次数

如何使这个循环更快?

我希望我的图像只有 10 种特定颜色,在 color_list 中指定。因此,我循环遍历每个像素,如果该像素的颜色未包含在颜色列表中,则分配相邻区域的颜色。但由于图像是 2k x 2k 像素。这个循环大约需要 3 分钟。我确信我这样做的方式不是最佳的。我该如何优化我的做法?

atlas_img_marked, atlas_img_cleaned = clean_img_pixels(atlas_img, color_list)

def clean_img_pixels(atlas_img, color_list):
    dd = 3
    for ii in range(atlas_img.shape[0]-1):
        for jj in range(atlas_img.shape[1]-1):
            pixelcolor = (atlas_img[ii,jj,0],atlas_img[ii,jj,1],atlas_img[ii,jj,2])
            if pixelcolor not in color_list:
                pixel2color = (atlas_img[ii-dd,jj,0],atlas_img[ii-dd,jj,1],atlas_img[ii-dd,jj,2])
                if (pixel2color == (0,0,0)) | (pixel2color not in color_list):
                    pixel2color = (atlas_img[ii+dd,jj,0],atlas_img[ii+dd,jj,1],atlas_img[ii+dd,jj,2])
                    if (pixel2color == (0,0,0)) | (pixel2color not in color_list):
                        pixel2color = (atlas_img[ii+5,jj,0],atlas_img[ii+5,jj,1],atlas_img[ii+5,jj,2])
                atlas_img_cleaned[ii,jj] = pixel2color
    return atlas_img_cleaned
Run Code Online (Sandbox Code Playgroud)

更准确地说,这是花费最长的部分:

out_colors = []
for ii in range(atlas_img.shape[0]-1):
    for jj …
Run Code Online (Sandbox Code Playgroud)

python optimization performance loops

5
推荐指数
1
解决办法
118
查看次数