Сравнение словаря значений со списком значений


В настоящее время я пытаюсь сравнить список значений пикселей 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 2

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