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

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

Графический интерфейс – 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.
Автор будет очень рад вменяемым комментариям.

Similar posts

AdBlock has stolen the banner, but banners are not teeth — they will be back

More
Ads

Comments 16

    0
    Почему json с неочевидной структурой (если не запускать графопостроитель), а не функциональный DSL? Входы и выходы функций — изображения. В данном случае концепция узлов и ссылок размыта.

    Ставилась ли цель получить нечто высокопроизводительное?
      0
      «Почему json с неочевидной структурой „
      JSON был реализован потому что он первый попался в качестве формата.
      Думаю легко можно переписать софт под другой более перспективный и функциональный формат.
      На мой взгляд JSON достаточен для данного проекта.

      “Ставилась ли цель получить нечто высокопроизводительное?»
      Да, производительность ставилась на первое место, по этому и были реализованны функции из библиотек Numpy/Scipy/
      /автор сам является профисеональным digital compositor/

      проект: open source (любой может привнести в него изменения (если данные изменения улучшат функциональность проекта))
        0
        Какие результаты по производительности в сравнении с популярными решениями (OpenCV)?
          0
          C OpenCV я не сравнивал (хотя некторые функции думал реализовать в своем проекте (tracking))
          Но все работает довольно быстро (можно протестировать это запустив python скрипт)
        0
        Возможно я дилетант, но если изображение разбивается на части и каждая обрабатывается отдельно — как обрабатываются крайние пиксели этих частей в случае фильтров, зависящих от соседних пикселей (которые в свою очередь попали в другую часть)?
          0
          Очень хороший вопрос!
          Я с этим столкнулся… Холст (canvas) увеличивается на размер радиуса фильтра. Данный алгоритм пока не реализовыван в виду академичности данного проета
            0
            code.google.com/p/image-tools-core/ в этом проекте я разделял избражение на потоки, обрабатывал их и столкнулся с данной проблеммой.
          0
          «Возможно я дилетант,» думаю вы не дилетант.
            0
            Скажите, а вы в сторону GEGL смотрели? Там тоже графы, тайловая обработка, а теперь ещё и над поддержкой GPU работают.
              0
              Даже не смотрел в сторону библиотеки(GEGL, первый раз об ней слышу), я пытался решать рельные задачи (возникающие у меня в процессе работы). Опыт програмироавния = 2 месяца (month)
            0
            Неплохо было бы вынести обработку изображений на GPU — разбивка на тайлы для распараллеливания обработки — хорошо, но все равно, видеокарта будет быстрее.

            Если Ваша система поддерживает WebGL, можете попробовать редактор webgl-filter и библиотеку glfx.js. Когда я в первый раз увидел ту штуку — был сильно удивлен скоростью работы фильтров, особенно swirl.
              0
              Подключить GPU не проблема. Это дело самой библиотеки GPU а не представленной программы. Если бы вы посмотрели исходники, то увидели бы как это (подключить GPU) просто сделать.
                0
                Думаю основня задача заключается не в том чем решать, а как решать.
                  0
                  По этому ядро и отделено. Что позволяет направить поток решений как в CPU так и в GPU.
                    0
                    «был сильно удивлен скоростью работы фильтров» надеюсь вы будете достаточно удивлены сколостью работы данного приложения

                  Only users with full accounts can post comments. Log in, please.