从弯曲的林中挑选颜色

2024-09-28 21:52:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一张和这张照片相当的图片:

this。在

它是一页纸上的一系列圆圈,在一条曲线上,每一次的线都不一样。在

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

进口后,我想知道有没有办法区分颜色。例如,这可能是:

^{pr2}$

这条线没有图案,而且有几千圈长,这意味着它不能手动完成。另外请注意,我实际测试的图像质量要高得多,实际图像可以找到here。在


Tags: from图像imageimportpil图片open曲线
2条回答

我认为你的主要问题是找到一条好的像素路径,从曲线的一端到另一端。一旦你决定了这条路,你就可以跟着它,并检查像素颜色。在

现在,我建议您自己通过指定一组航路点来输入路径。下面是一些代码用于示例图。我把第一个点放在左边的紫色圆盘上,第二个点在角度上,最后一个点在右下角的紫色圆盘上。在

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

它打印:

^{pr2}$

对于你的大图像,你可以手工输入所有的航路点。或者尝试编写一段智能代码来自动找到它们;)

只需沿行创建一个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)

相关问题 更多 >