В настоящее время я пытаюсь сравнить список значений 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
Почему словари? Почему бы просто не установить тоны как кортежи с (r, g, b) в виде чисел. Это более безопасно из-за неизменности кортежей и так же быстро, просто заменяя ключевой поиск поиском индекса. Не только это, но итерация по словарю возвращает ключи, где, когда итерация через кортеж возвращает значения. –
Спасибо, что указал. Я работал над старым кодом коллег, и мне не приходило в голову изменить тоны на кортежи. Другой вопрос для вас, могу ли я использовать списки? – Coeus
Абсолютно. В Python все базовые контейнеры (списки, кортежи) работают очень схожим образом, с их основной разницей является изменчивость. В этом случае кажется, что вам нужны цвета, привязанные к определенным значениям rgb, поэтому неизменный тип данных является более безопасным способом. –