Экспериментируем дальше.
Предыдущий макет практически может быть применим для работы как с единичными буквами, так и с текстом в целом (например для выделения отдельных слов - как целостностей). Но с учётом того, что он работает с отдельными точками изображения, скорость вычислений на обычных десктопах недопустимо мала.
Следующий макет показывает, как можно уменьшить общее число отдельных однородностей изображения.
Элементарной однородностью растрового изображения является точка - квадратик. Было бы очень удобно, если бы изображение представляло собой что-то вроде плотно упакованных кружков в сотовые структуры. Таких графических форматов и мониторов, к сожалению не производят, но ничто не мешает работать с более крупными однородными прямоугольными областями, вместо отдельных точек.
После открытия изображения и нажатия на кнопку "Test" макет выполняет следующий рекурсивный алгоритм для разбиения изображения на прямоугольники:
1. На вход рекурсивной процедуры подаются координаты прямоугольника (при инициализации подаются координаты прямоугольника всего изображения с уже разделёнными цветами на строго чёрный и белый (см. предыдущий макет)).
2. Вычисляется средний цвет для этого прямоугольника.
3. Если средний цвет белый - выходим из процедуры.
4. Если средний цвет черный - прямоугольник закрашивается случайным цветом (для наглядного теста) и выходим из процедуры.
5. Если средний цвет не чёрный и не белый, то делим прямоугольник пополам и каждую половину отправляем на рекурсию т.е. на шаг №1 (нечётные шаги рекурсии разбивают входной прямоугольник пополам по вертикали, чётные - по горизонтали).
В результате крупные однородные участки изображения (в частности буквы) выделяются в отдельные большие прямоугольники, изгибы и точки - апроксимируются более мелкими прямоугольниками. Особенно хорошо это видно на огромных изображениях. После выполнения алгоритма в заголовке окна высвечивается 3 числа: количество точек - количество прямоугольников - количество прямоугольников с площадью 1 пиксел. Выигрыш в количестве отдельных однородностей, в сравнении с точечным представлением, приблизительно 1 порядок.
В качестве дальнейшего экперимента планирую совместить макет 1 и макет 2, чтобы взаимодействовали не отдельные точки, а отдельные прямоугольники.
Предыдущий макет показал занятный способ избавления от шума. Мелкие точки - "лёгкие", поэтому "прилипают" к массивной букве. Второй макет даёт возможность другим способом избавиться от шума. На каждом изображении после применения приведённого алгоритма получается разброс между размерами самого крупного и самого мелкого прямоугольника. Если пронормировать размер прямоугольников по самому крупному, то можно просто игнорировать прямоугольники, размер которых меньше некоторого порогового значения.
P.S. В первом макете случайно забыл вытереть остатки некоторых экспериментов, поэтому каждая точка при запуске модели инициализировалась небольшим случайным ускорением, поэтому абсолютно симметричные изображения разлетались чуть не симметрично (уже всё поправил). В целом на результаты работы модели эта помарка существенно не влияет.