Документация Engee
Notebook

Работа с изображениями в Engee

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

Предназначение примера

Графические среды проектирования позволяют достигать очень высокой скорости разработки. И хотя для полноценной графической разработки нужна большая библиотека компонентов, в которой проектировщик должен уметь разбираться, этот подход позволяет избежать ошибок кодирования и в целом уравнять возможности профессиональных программистов и экспертов других прикладных научных областей.

Описание задачи

В данном примере мы покажем, как загрузить изображение в компонент на холсте и инвертируем один из каналов. Название входного файла с изображением нужно привести в качестве параметра Название файла блока Изображение. Предполагается, что изображение имеет 4 канала.

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

Предупреждение о размере изображения

Способ сохранения изображения внутри блока не слишком эффективен при работе с большими изображениями. Возможно, так происходит если хранить матрицы в текстовой форме внутри кода блока.

Рекомендуем отлаживать алгоритм на изображении маленького размера (меньше 200 пикселей по стороне). Скорее всего, для хорошей обработки больших изображений, их нужно размещать их в коде компонентов в формате char* и "распаковывать" при помощи дополнительных библиотек на C/C++.

С исходным изображением 300 на 300 модель компилируется 62 секунды, инициализируется 49, выполняется 0.36 с (в сумме 110 с).

С исходным изображением 200 на 200 модель компилируется 18 секунд, инициализируется 25 и выполняется 0.32 с (в сумме 43 с).

Изображения 100*100 обрабатываются меньше 10 секунд, включая компиляцию модели и инициализацию.

Описание модели

При изменении параметров маски изображение на лицевой стороне блока обновляется. Изображение также помещается внутри кода блока и не стирается, если переместить модель или переместить или удалить исходный файл с изображением.

image.png

Запустим модель через механизм программного управления:

In [ ]:
model_name = "picture_read_model";
model_name in [m.name for m in engee.get_all_models()] ? engee.open(model_name) : engee.load( "$(@__DIR__)/$(model_name).engee");
res = engee.run( model_name );

Изучить преобразованное изображение можно, обратившись к функции RGBA библиотеки Images.jl

In [ ]:
pic = RGBA.( collect(res["out_R"])[end,end]./255,
       collect(res["out_G"])[end,end]./255,
       collect(res["out_B"])[end,end]./255,
       collect(res["out_A"])[end,end]./255 )
Out[0]:
No description has been provided for this image

Сохраним полученное изображение в файл.

In [ ]:
save( "out.png", pic )

Как и предполагалось, мы инвертировали значения в канале красного цвета, убрали канал прозрачности и вывели изображение.

Заключение

Engee позволяет сравнительно несложно прототипировать алгоритмы машинного зрения, сохраняя иерархичность и логистическую ясность производимых операций, которые дает графическое программирование.

Блоки, использованные в примере