Загрузка и оценка пикселей с помощью PIL - PullRequest
3 голосов
/ 02 октября 2011

Я хочу создать программу, которая загружает значения RGB каждого пикселя в изображении и сохраняет их в виде списка / словаря / кортежа, а затем, когда я набираю значение, он сообщает мне, сколько пикселей в изображении имеет это значение. До сих пор я прочитал всю документацию PIL, пытаясь найти метод, который бы соответствовал моим потребностям, и я попробовал несколько других подходов, например, с помощью функции .getpixel () или .load (), но сохранить очень сложно и оценить эту информацию для каждого пикселя.

Ответы [ 4 ]

5 голосов
/ 02 октября 2011

Сначала вы захотите преобразовать изображение в режим «RGB», чтобы всегда получать (R, G, B) кортежи для пикселей, даже для черно-белых / черно-белых изображений.

image = image.convert("RGB")

Затем выполните итерацию по getdata() для построения гистограммы.

colors = {}

for color in image.getdata():
    colors[color] = colors.get(color, 0) + 1

Затем вы можете использовать get () , чтобы получить количество пикселей данного цвета

print colors.get((255, 255, 255), 0)  # No. of white pixels
3 голосов
/ 21 октября 2012

Новым в версии 1.1.5 PIL является метод getcolors(), который должен делать именно то, что вы ищете.Документация из веб-документации PIL:

getcolors

im.getcolors () => список (количество, цвет) кортежей или None

im.getcolors (maxcolors) => список (количество, цвет) кортежей или нет

(Новое в 1.1.5) Возвращает несортированный список (количество, цвет) кортежей, где количество - это числораз соответствующий цвет появляется на изображении.

Если значение maxcolors превышено, метод прекращает отсчет и возвращает None.Значение по умолчанию maxcolors равно 256. Чтобы получить все цвета на изображении, вы можете передать размер [0] * размер [1] (но убедитесь, что у вас достаточно памяти, прежде чем делать это на больших изображениях).

2 голосов
/ 02 октября 2011

.load() это путь. Он работает очень эффективно и позволяет быстро получить много пикселей.

width,height=image.size
px=image.load()

col={}

for y in range(height):
    for x in range(width):
        c=px[x,y]
        col[c]=col.get(c,0)+1

# `col` will look like this: {(r,g,b):n,...}
1 голос
/ 02 октября 2011

Я думаю, что .getpixel() - это именно то, что вам нужно - если вы собираетесь делать много поисков, и вам нужна скорость, то обведите каждое изображение один раз, создав словарь координат, в котором найден каждый цвет. Сделайте так, чтобы это выглядело так:

{
    (128,128,4): [(1,1), (1,2)],
    (128,130,6): [(1,3)],
    ...
}

Конечно, если вам нужны именно те подсчеты (вы строите гистограмму, тогда?), Тогда просто сохраняйте целое число в каждой записи словаря вместо всего списка точек.

Если только метод .histogram() выводит свои результаты по определенному цвету - но похоже, что он возвращает каждый канал отдельно, без учета комбинаций, в которых различные цветовые компоненты появляются вместе.

...