Учитывая изображение (файл .tiff или geotiff) с ровно 22 цветами (каждый с отличным значением RGB), каковы подходы к раздельному («фильтру») из них на 22 отдельных изображения , каждый из которых содержит только те пиксели со специфическим значением RGB?PIL? Извлеките все пиксели заданного значения RGB
1
A
ответ
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()
- Вызов
im.getcolors()
возвращает список всех цветов в изображении и количество раз они происходят, как кортеж, если количество цветов не превышает максимальное значение (которое вы можете указать, по умолчанию до 256). - Затем мы строим словарь
colors_dict
, с ключом по цветам на изображении и с соответствующими значениями пустых изображений. - Затем мы перебираем изображение для всех пикселей, обновляя соответствующую запись словаря для каждого пикселя. Выполнение этого так означает, что нам нужно только один раз прочитать изображение. Мы используем
load()
, чтобы сделать доступ к пикселям быстрее, когда мы читаем изображение. 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 цветное изображение:
22 цветные изолированные изображения:
Итак, как вы бы объединить несколько из 22 изображений, скажем, желтые и красные ? Или, по крайней мере, не иметь черного в изображениях, чтобы позволить нескольким из 22 изображений вставить в новое изображение? – klocey