Сравнение словаря значений со списком значений
В настоящее время я пытаюсь сравнить список значений пикселей R/G/B, которые я получаю из изображения, с предопределенным словарем значений RGB. Мой вопрос заключается в том, каков был бы самый простой (и самый простой) способ сравнить каждое значение пикселя 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 "nnnn The image matches the data in the corpus"
break
2 ответа:
Похоже, что вы немного ошиблись. Попробуйте использовать кортеж значений RGB в качестве ключа к вашему словарю и "имя" его в качестве результата, а затем найдите пиксель:
colours = { (247, 217, 214): 'lc', (240, 186, 173): 'c' } colour_type = colours.get(pixel, 'no match')
Просто убедитесь, что
pixel
является 3-х элементным кортежем значений RGB, и вышеописанное должно просто работать.
Вы можете сравнить два значения dict с
==
, и это сделает именно то, что вы надеялись:>>> {'r': 2, 'g': 3, 'b': 4} == {'g': 3, 'b': 4, 'r': 2} True
Итак, если
pixels
- это список списков диктов, просто сделайте: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