Работа с изображениями в 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 секунд, включая компиляцию модели и инициализацию.
Описание модели¶
При изменении параметров маски изображение на лицевой стороне блока обновляется. Изображение также помещается внутри кода блока и не стирается, если переместить модель или переместить или удалить исходный файл с изображением.
Запустим модель через механизм программного управления:
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
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 )
Сохраним полученное изображение в файл.
save( "out.png", pic )
Как и предполагалось, мы инвертировали значения в канале красного цвета, убрали канал прозрачности и вывели изображение.
Заключение¶
Engee позволяет сравнительно несложно прототипировать алгоритмы машинного зрения, сохраняя иерархичность и логистическую ясность производимых операций, которые дает графическое программирование.