Pull to refresh

Создание прототипа программы обработки изображений

PythonImage processing
Sandbox
Прототип разрабатывается как распределенная система: графический интерфейс с частичной обработкой графических данных (далее графики) и удаленное ядро, производящее основную и финальную обработку изображений.

Графический интерфейс – node based: Каждая операция производимая над изображением представляется как узел (node), узлы связны между собой связями образуя дерево (ориентированный граф) решений. Данные идут от узла (node) Read (или ноды генерирующей процедурное изображение (constant color, gradient и т. п.)) к узлу Write поэтапно подвергаясь обработке в каждом узле. Узлы делятся на: Color correct, Image transform, Image read/write/view, Image create, Image filter, Image merge, Image channel editing. Узлы Read и ноды генерирующие процедурные изображения объявляются корневыми (root) узлами, с них начинается исполнение процесса.

Перед обработкой изображение разбивается на части (tiles). Каждая часть попадает в отдельный поток конвейерной обработки (в соответствии с загруженным сценарием). На выходе отдельные части собираются в результирующее изображение. Каждая из частей может быть обработана как локально так и на удаленном сервере (облаке). Также возможна обработка всего изображения целиком.

image
Архитектура системы



Сценарий исполнения представлен в виде ориентированного графа, где каждый узел(нода) это объект с описанием процедур и свойств: node.procedure, node.properties. Перед выполнением ядро преобразует граф и ориентирует его для последовательного выполнения операций.

Пример:
read_01(file_name_01.jpg)->blur_01->size_01
read_02(file_name_02.jpg)->blur_02->size_02

выходы с узлов size_01 и size_02 идут в узел merge (plus) где происходит сложение обеих потоков с последующей записью (write) на диск. Ядро разворачивает граф и выполняет последовательно:

read_01->blur_01->size_01 || read_02->blur_02->size_02 ||
size_01,size_01-->> megre(plus)->write(file_name_out.jpg)

В узле (node) так же есть ссылка (кроме узлов root) на источник данных (предыдущий узел в графе).
Через ссылки все узлы связанны, образуя ориентированный граф:

read_01->size_01(link to read_01)->write_01(link to size_01)

Узел Merge имеет как минимум два входа: merge_01(link_a, link_b)

Реализованные функции: Read, Write, Blur, Sharpen, Color Correct, Size, Rotate, Composite, View.
Формат описания сценария: JSON

Для разработки ядра применяются: Python 2.7, Python Image Library, Numpy/Scipy
Библиотеки для визуализатора графов: NetworkX, matplotlib

image
Визуализация графа

Пример сценария: (test.json):
{
    "node1":{
        "name" : "read_01",
        "type" : "read",
        "file" : "in.jpg",
        "id": 1
        },
    "node2":{
        "name" : "blur_01",
        "type" : "blur",
        "link" : "read_01",
        "size" : 10,
        "id": 2
        },
    "node3":{
        "name" : "write_01",
        "type" : "write",
        "link" : "blur_01",
        "file" : "test.jpg",
        "id": 3
        }
}


Автор не ставит перед собой цели выпустить готовое программное обеспечение.
Это исследовательский проект. Just for fun.

Ссылка на репозиторий с проектом:
github.com/shrimo/node_image_tools

Эскиз GUI:

image

www.behance.net/gallery/Neural-composer/6203259

Подробное описание процедур и свойств узлов:
docs.google.com/document/d/1ehPRAwRzhlibXLq6l_6LlObTzN8K20E6Toa9820EmvY/pub

P.S.
Автор будет очень рад вменяемым комментариям.
Tags:pythonОбработка изображенийинтерфейсыopen sourceалгоритмы
Hubs: Python Image processing
Total votes 19: ↑16 and ↓3+13
Views13K

Popular right now