【问题标题】:Defining analogue (similar) colors定义模拟(相似)颜色
【发布时间】:2020-02-14 20:55:38
【问题描述】:

我想做一个从图像中获取颜色的程序,而不是给我模拟颜色..., 但我不知道如何使用从图像中获取的颜色,因为它没有像对象那样给我颜色...

我试着做这样的:

from PIL import Image

img = Image.open("C:/Marco/programas/orange2.jpg").convert("P")

colors = []

for cor_rgb in img.getpalette():
    if cor_rgb not in colors:
        colors.append(cor_rgb)
c = Image.Image.getdata(img)

print(c)
print (colors)

有人可以帮帮我吗?

【问题讨论】:

  • getpalette 的文档显示它以平面列表的形式提供 - [R,G,B, ... ]。使用 numpy.array 您可以将其重塑为数组 [ [R,G,B], [...], ...]

标签: python colors transform


【解决方案1】:

您可以在使用Image.convert() 方法时指定自适应转换。没有给出细节,但在这种情况下,“自适应”通常是指最能代表图像中的颜色的设置颜色。

完成转换后,Image.getpalette() 返回的值是一个 RGB 颜色列表,代表自适应算法选择放入调色板的每种颜色。从使用我的测试图像的结果来看,看起来颜色在表格中按受欢迎程度排序(但我不确定,也没有记录)。

Adobe Photoshop® 等专业图像编辑程序在转换为调色图像时有多种选择,包括“选择性”、“统一”和“感知”。我经常使用后者,因为它考虑到人眼无法平均检测所有颜色之间的差异这一事实,它使用一些度量来衡量“感知色差”。

from PIL import Image

image_filename = "oranges2.jpg"
img = Image.open(image_filename).convert("P", palette=Image.ADAPTIVE)
palette = img.getpalette()
colors = [palette[i:i+3]  # Split palette entries up into groups of 3.
            for i in range(0, len(palette), 3)]

print(len(colors))
for color in colors:
    print(color)

样本输出:

256
[250, 212, 69]
[253, 194, 17]
[252, 185, 22]
[254, 185, 1]
[255, 177, 10]
[255, 177, 2]
[255, 177, 0]
[254, 177, 2]
[240, 177, 35]
[255, 167, 10]
[255, 168, 4]
[255, 167, 2]
...
[115, 15, 1]
[98, 19, 1]
[98, 11, 1]
[86, 16, 2]
[75, 15, 2]
[83, 7, 1]
[72, 7, 1]
[58, 12, 3]
[56, 6, 1]
[59, 3, 1]
[48, 3, 1]
[36, 8, 3]
[36, 2, 1]
[20, 6, 3]
[18, 2, 1]

这是我用于测试的图像文件:

【讨论】:

  • 下采样后,您拥有索引彩色图像和正确的调色板——只有 256 个条目。如果您真的想知道实际频率,请再次循环图像并计数。 :)(实际上,PIL 当然已经这样做了,但是如果这些数据不暴露给用户,那就没有用了......)
  • @usr2564301:使用Image.histogram() 函数可能会快得多。没有什么要求调色板中的颜色与原始图像中的任何颜色完全匹配,它们只需要“接近”即可。使用的算法可能只是试图最小化图像的原始版本和调色板版本中的像素之间的差异 - 但文档再次没有说明正在使用该技术。也许可以使用 histogram() 来确定“模拟” OP 想要的颜色。
【解决方案2】:

getpalette 的文档显示它以平面列表 [R,G,B, ... ] 的形式提供。使用 numpy.array 您可以将其重塑为数组 [ [R,G,B], [...], ...] 并获得唯一元素

from PIL import Image
import numpy

img = Image.open("image.jpg").convert("P")

colors = numpy.array(img.getpalette())
colors = colors.reshape((-1,3))
colors = numpy.unique(colors, axis=0)

print(colors)

示例结果

[[  0   0   0]
 [  0   0  51]
 [  0   0 102]
 [  0   0 153]
 [  0   0 204]
 [  0   0 255]
 [  0  51   0]
 [  0  51  51]
 [  0  51 102]
 [  0  51 153]
 [  0  51 204]
 [  0  51 255]
 [  0 102   0]
 [  0 102  51]
 [  0 102 102]
 [  0 102 153]
 [  0 102 204]
 [  0 102 255]

但我不知道如何定义“模拟颜色”

【讨论】:

  • 谢谢大家,但是可以将此结果用于任何其他操作吗?例如:取橙色并使用数字(255、177、35)将其排成一行来做某事?或者我不能使用这个结果?
猜你喜欢
  • 2016-12-08
  • 1970-01-01
  • 2015-08-20
  • 2020-12-07
  • 1970-01-01
  • 2011-12-12
  • 2010-11-13
  • 2015-10-01
相关资源
最近更新 更多