2014-12-22 3 views
11

У меня есть изображение, которое выглядит эквивалент этого изображения:цвета выбирая из извилистой линии

this.

Это серия кругов на странице в извилистой линии, и линия отличается каждый раз.

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

После того как я импортировал его, мне было интересно, существует ли способ различать цвета. Для примера, это может быть:

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

линия не имеет шаблон к нему, и длиной в несколько тысяч кругов, а это значит, что она не может быть сделано вручную. Также обратите внимание, что изображение, которое я на самом деле тестирую, имеет гораздо более высокое качество, фактическое изображение можно найти here.

+1

Немного непонятно, что именно вы пытаетесь сделать. Пожалуйста, покажите код? Каков источник этого изображения? –

+0

А, ладно, я добавлю какой-нибудь код и попытаюсь развернуть, не задумываясь, давая мне минуту. –

+1

Я заинтригован :-) Можете ли вы сказать, что делаете с такими вещами - что их генерирует и как вы их используете? –

ответ

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

Я думаю, что главная проблема для вас, чтобы найти хороший путь пикселей следовать от одного конца вашей кривой на другую. После того, как вы решите этот путь, вы можете просто следить за ним и проверять цвета пикселей по мере продвижения.

В настоящее время я предлагаю вам ввести путь самостоятельно, указав набор путевых точек. Вот код для вашего примера. Я занял первое место на левом фиолетовом диске, второй - под углом, а последний - на нижнем правом фиолетовом диске.

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'] 

Для вашего большого изображения, вы можете ввести все путевые точки вручную. Или попробуйте сделать смарт-кусок кода, чтобы найти их автоматически;)

Смежные вопросы