2011-12-28 1 views
1

Учитывая изображение (файл .tiff или geotiff) с ровно 22 цветами (каждый с отличным значением RGB), каковы подходы к раздельному («фильтру») из них на 22 отдельных изображения , каждый из которых содержит только те пиксели со специфическим значением RGB?PIL? Извлеките все пиксели заданного значения RGB

ответ

4

Это пиксельный способ сделать это, что может работать для любого количества цветов на изображении (хотя оно может замедляться для многих цветов и больших изображений). Он также будет работать для пакетированных изображений (он преобразует их).

import Image 

def color_separator(im): 
    if im.getpalette(): 
     im = im.convert('RGB') 

    colors = im.getcolors() 
    width, height = im.size 
    colors_dict = dict((val[1],Image.new('RGB', (width, height), (0,0,0))) 
         for val in colors) 
    pix = im.load()  
    for i in xrange(width): 
     for j in xrange(height): 
      colors_dict[pix[i,j]].putpixel((i,j), pix[i,j]) 
    return colors_dict 

im = Image.open("colorwheel.tiff") 
colors_dict = color_separator(im) 
#show the images: 
colors_dict.popitem()[1].show() 
colors_dict.popitem()[1].show() 
  1. Вызов im.getcolors() возвращает список всех цветов в изображении и количество раз они происходят, как кортеж, если количество цветов не превышает максимальное значение (которое вы можете указать, по умолчанию до 256).
  2. Затем мы строим словарь colors_dict, с ключом по цветам на изображении и с соответствующими значениями пустых изображений.
  3. Затем мы перебираем изображение для всех пикселей, обновляя соответствующую запись словаря для каждого пикселя. Выполнение этого так означает, что нам нужно только один раз прочитать изображение. Мы используем load(), чтобы сделать доступ к пикселям быстрее, когда мы читаем изображение.
  4. color_separator() возвращает словарь изображений, с помощью каждого уникального цвета на изображении.

Чтобы ускорить процесс, вы можете использовать load() для каждого изображения в colors_dict, но вам может понадобиться, чтобы быть немного осторожным, поскольку он может потреблять много памяти, если изображение имеет много цветов и большие. Если это не проблема, а затем добавить (после создания colors_dict):

fast_colors = dict((key, value.load()) for key, value in colors_dict.items()) 

и подкачку:

colors_dict[pix[j,i]].putpixel((j,i), pix[j,i]) 

для:

fast_colors[pix[j,i]][j,i] = pix[j,i] 

22 цветное изображение: enter image description here

22 цветные изолированные изображения:

enter image description hereenter image description hereenter image description hereenter image description hereenter image description hereenter image description hereenter image description hereenter image description hereenter image description hereenter image description hereenter image description hereenter image description hereenter image description here enter image description hereenter image description hereenter image description hereenter image description hereenter image description here enter image description hereenter image description hereenter image description hereenter image description here

+0

Итак, как вы бы объединить несколько из 22 изображений, скажем, желтые и красные ? Или, по крайней мере, не иметь черного в изображениях, чтобы позволить нескольким из 22 изображений вставить в новое изображение? – klocey