2013-11-19 2 views
2

В настоящее время я пытаюсь сравнить список значений R/G/B пикселей, которые я получаю от изображения, до предопределенного словаря значений RGB. Мой вопрос заключается в том, какой был бы самый pythonic (и самый простой) способ сравнить каждое значение пикселя RGB, взятое из изображения, до предопределенного значения словаря.Сравнение словаря значений со списком значений

Обновлено:

#!/usr/bin/python 

import Image 

img = Image.open("/home/user/Pictures/pic.jpg") 
pix = img.load() 

    width, height = img.size #Image size 

    pixels = list(img.getdata()) 

     #used for testing 

picture_colours = { 
     (1, 1, 1): 'known1', 
     (4, 4, 4): 'known2', 
     (7, 3, 0): 'known3', 
     (8, 3, 0): 'known4', 
     (9, 4, 0): 'known5', 
     (10, 5, 1): 'known6', 
     (11, 6, 2): 'known7', 
     (12, 7, 3): 'known8', 
     (13, 8, 4): 'known9', 
     (12, 7, 3): 'known10' 

} 
colour_type = picture_colours.get(pixels, 'no match') 
match = 0 #default value 

for pixel in pixels: 
     print pixel #used to ensure pixels are in the (x, x ,x) format 
     colour_type = picture_colours.get(pixel, 'no match') 
     print colour_type #printing either 'no match' or one of the dictionary names(w1,c,asian) 
     if(colour_type != 'no match'): 
       match = match + 1 #For every matched pixel, + 1 

     if(match >= 30): 
       print "\n\n\n\n The image matches the data in the corpus" 
       break 
+1

Почему словари? Почему бы просто не установить тоны как кортежи с (r, g, b) в виде чисел. Это более безопасно из-за неизменности кортежей и так же быстро, просто заменяя ключевой поиск поиском индекса. Не только это, но итерация по словарю возвращает ключи, где, когда итерация через кортеж возвращает значения. –

+0

Спасибо, что указал. Я работал над старым кодом коллег, и мне не приходило в голову изменить тоны на кортежи. Другой вопрос для вас, могу ли я использовать списки? – Coeus

+0

Абсолютно. В Python все базовые контейнеры (списки, кортежи) работают очень схожим образом, с их основной разницей является изменчивость. В этом случае кажется, что вам нужны цвета, привязанные к определенным значениям rgb, поэтому неизменный тип данных является более безопасным способом. –

ответ

5

Похоже, у вас есть это слегка неправильный путь вокруг. Попробуйте использовать кортеж из значений RGB в качестве ключа к словарю, и «имя» этого, как результат, а затем посмотреть на пиксель:

colours = { 
    (247, 217, 214): 'lc', 
    (240, 186, 173): 'c' 
} 

colour_type = colours.get(pixel, 'no match') 

Просто убедитесь, что pixel является 3-элемент кортежа Значения RGB и выше должны работать.

1

Вы можете сравнить два значения Dict с ==, и он будет делать то, что вы надеялись:

>>> {'r': 2, 'g': 3, 'b': 4} == {'g': 3, 'b': 4, 'r': 2} 
True 

Так что, если pixels список списков dicts, просто сделать:

pixels[y][x] == lc 

Если это не так, просто написать функцию, которая преобразует одного формата в другой:

def rgbify(rgbtuple): 
    return {'r': rgbtuple[0], 'g': rgbtuple[1], 'b': rgbtuple[2]} 
rgbify(pixels[y][x]) == lc 

... или:

def rgbify(rgbdict): 
    return (rgbdict['r'], rgbdict['g'], rgbdict['b']) 
pixels[y][x] == rgbify(lc) 

Но это поднимает вопрос о том, почему вы хотите использовать другой формат, в первую очередь. Вы разрабатываете хотя бы одну из этих двух вещей; зачем создавать два несовместимых формата?

Если вы просто ищете способ, чтобы сделать вещи более явными, чем просто кортеж из трех номеров, вы можете рассмотреть это:

>>> Color = collections.namedtuple('Color' list('rgb')) 
>>> lc = Color(r=247, g=217, b=214) 
Color(r=247, g=217, b=214) 
>>> lc = Color(247, 217, 214) 
>>> lc 
Color(r=247, g=217, b=214) 
>>> lc.r 
247 
>>> lc == (247, 217, 214) 
True 
Смежные вопросы