Эквализация гистограмм

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

Читать далее →

Подробнее

По следам неудачного примера из vectorflow. Часть II. Обучаем нейросеть на 60 000 PPM-файлах

В предыдущей части, мы показали как можно использовать D в качестве скриптового языка, который помог перевести множество изображений из базы данных MNIST в более удобный для разбора формат PPM P6. Несмотря на то, что использовалась одна внешняя библиотека (а именно, разработанная нами ppmformats), код по большей части задействует ресурсы стандартной библиотеки языка и остается простым.

Если вы помните, результатом работы программы из Части I являлась папка со множеством файлов формата PPM P6, а в этой статье, мы покажем, как их подать на вход нейронной сети.

Читать далее →

Подробнее

По следам неудачного примера из vectorflow. Часть I: конверсия датасетов в удобный формат

Порой я, в поисках идей, просматриваю рабочую папку на предмет неудавшихся или провалившихся идей программ, и иногда из отчаяния и безысходности я выбираю то, что перерастет в последствии в нечто захватывающее и интересное…Если говорить более конкретно, то мне попался на глаза наш неудачный эксперимент с нейросетями в библиотеке от Netflix, который закончился весьма плохо, а именно с ошибкой около 41%.

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

Читать далее →

Подробнее

Библиотека ppmformats. Чему я научился создавая обработчики PortablePixmap форматов

Недавно, я понял, что довольно часто я работаю с D не с домашнего компьютера, а с обычного смартфона. На смартфоне у меня стоит почти та же среда, что и на компьютере (я имею в виду, что на компьютере и смартфоне одинаковый комплект консольных утилит и их настройки так же одинаковы), а это значит, что хочется единообразной работы кода на столь разных платформах. Добившись успеха с некоторыми из примеров блога, я решил попытать счастья с обработкой изображений на смартфоне, поскольку довольно часто источником графических данных является именно смартфон…

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

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

Читать далее →

Подробнее

Добавляем текст на изображения в dlib

Когда я начал использовать dlib, то столкнулся с необходимостью вставки в изображение некоторого текста. Оказалось, что встроенной в dlib процедуры, которая рисует текст на картинке нет, а она была бы полезна в некоторых практических приложениях: отрисовке графиков функций с подписями осей, визуализации текстовой информации, подготовке диаграмм и иной инфографики. Я думал, с течением времени в dlib появится нечто вроде drawText или drawString, но постепенно пришел к выводу, что реализация такого примитива выходит за рамки самой библиотеки и сопряжена с немалыми трудностями, особенно, если учесть, что существует огромное количество шрифтов и сложности с их рендерингом.

Казалось бы, о добавлении каких-либо надписей с помощью dlib можно забыть, но я пошел обходным путём…

Читать далее →

Подробнее

Циклические сдвиги и криптопримитив enRUPT

Читая статьи с HabrHabr по одному из самых странных языков программирования (называется J, если кому-то интересно), я встретил в комментариях описание очень простого и компактного алгоритма шифрования под названием enRUPT.

Меня заинтересовало то, что этот алгоритм, точнее криптопримитив (элементарную криптографическую операцию) можно описать буквально в несколько строк.

Читать далее →

Подробнее

Определить порядок байтов, используемый текущей архитектурой

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

Читать далее →

Подробнее

Простой ГПСЧ на базе XorShift256

В этой статье, я покажу простой рецепт для того, чтобы создать собственный генератор псевдослучайных чисел (ГПСЧ) на базе известного алгоритма XorShift256.

Данный генератор потребует минимального набора операций, а также задания нескольких констант, инициализирующих ГПСЧ (параметры называются по четырем первым буквам латинского алфавита, и хранятся в виде статического массива ulong[4]). Константы для генератора надо либо подбирать эмпирически, либо брать из известных исследований или статистических проверок, но это нисколько не усложняет данный ГПСЧ, который организуется в одну функцию.

Читать далее →

Подробнее

Перемещение объектов в heap

Официальная документация частенько удивляет! На этот раз мы нашли полезный рецепт в changelog к старой (на данный момент) версии компилятора.

Шаблон moveToHeap принимает некий объект, извлекает указатель на него, производит выделение памяти с помощью GC.malloc и  moveEmplace (который лежит в std.algorithm) осуществляет перемещение данных из одного участка памяти в другой. С помощью взятия и распечатки указателей на объект до и после перемещения убеждаемся, что указывают они на разные участки памяти (указатель — это адрес, распечатав адреса видим что они разные). Читать далее →

Подробнее

Использование dub для приложений из одного *.d файла

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

Читать далее →

Подробнее