从曲线挑选颜色

时间:2014-12-22 10:33:16

标签: python image python-3.x

我有一张看起来与此图片相同的图片:

this

曲线上的页面上有一系列圆圈,每次都不同。

from PIL import Image
im = Image.open("bride.jpg")

导入后,我想知道是否有区分颜色的方法。例如,这可能是:

[Purple, Cyan, Purple, Cyan, Purple Cyan...]

该行没有任何模式,长度为几千个圆圈,这意味着无法手动完成。另请注意,我实际测试的图像质量要高得多,可以找到实际图像here

2 个答案:

答案 0 :(得分:1)

只需沿着该行创建RGB值列表,然后过滤列表以删除相邻的值。

Get pixel's RGB using PIL

#find RGB values   
rgb_values = []
for point in line:
   r, g, b = rgb_im.getpixel(point)
   rgb_values += [ (r,g,b)]
#remove similar adjacent values
for i in range(len(rgb_values)-1):
    if rgb_values[i] == rgb_values[i+1]:
        rgb_values.pop(i)
        i -= 1
if len(rgb_values) > 1:
    if rgb_values[-1] == rgb_values[-2]:
         rgb_values.pop(-1)

答案 1 :(得分:1)

我认为你的主要问题是从曲线的一端到另一端找到一条良好的像素路径。一旦确定了这条路径,就可以随意跟踪它,并随时查看像素颜色。

现在,我建议您通过指定一组航点来自行输入路径。以下是您的示例图的一些代码。我拿左紫色光盘的第一个点,角度的第二个点,右下角紫色光盘的最后一个点。

from PIL import Image
from numpy import array, arange

im = Image.open("aqoGkjs.png")
rgb_im = im.convert('RGB')

def get_color_at(p):  # color function as mattsap suggested
    r, g, b = rgb_im.getpixel(tuple(p))
    if r > g and r > b:
        return 'Purple'
    elif r < 10 and g < 10:
        return 'Blue'
    return 'Cyan'

colors = []
via_points = [array([25, 65]), array([185, 44]), array([240, 210])]

for i in xrange(len(via_points) - 1):
    for x in arange(0, 1, 0.01):
        p = x * via_points[i] + (1 - x) * via_points[i + 1]  # linear interpolation
        cur_color = get_color_at(p)
        if cur_color == 'Blue':  # ignore borders
            continue
        if not colors or cur_color != colors[-1]:
            colors.append(cur_color)

print colors

打印:

 ['Purple', 'Cyan', 'Purple', 'Cyan', 'Purple', 'Cyan', 'Purple', 'Cyan', 'Purple', 'Cyan', 'Purple', 'Cyan', 'Purple', 'Cyan', 'Purple', 'Cyan', 'Purple']

对于大图,您可以手动输入所有航点。或者尝试制作一段智能代码以自动找到它们;)