Поскольку у вас уже есть хорошее двоичное изображение, может быть проще всего просто разделить различные подключенные компоненты изображения и затем рассчитать их параметры.
Во-первых, вы можете выполнить разделение путем сканирования изображения, а когда вы столкнетесь с черным пикселем, вы можете применить стандартный алгоритм flood-fill , чтобы определить все пиксели в вашей форме. Если у вас есть набор инструментов изображения Matlab, вы можете найти для этого процедуры bwconncomp и bwselect . Если ваши фигуры не полностью связаны, вы можете применить к своему изображению операцию морфологическое закрытие , чтобы соединить фигуры.
После того, как вы сегментировали различные формы, вы можете отфильтровать кривые, проверяя, насколько они отклоняются от линии. Вы можете сделать это, просто взяв конечные точки кривой и рассчитав расстояние до других точек от линии, определенной конечными точками. Если это значение превышает некоторый максимум, у вас есть кривая вместо линии.
Другой подход заключается в измерении соотношения расстояния между конечными точками и длиной объекта. Это отношение будет около 1 для линий и больше для кривых и волнистых форм.
Если ваши изображения имеют углы, которые вы хотите отделить от кривых, вы можете проверить направленный градиент ваших кривых. Сегментируйте фигуру, выберите из нее множество равноотстоящих точек и для каждой точки вычислите угол к предыдущей точке и к следующей точке. Если разница в углах слишком велика, вы получаете не гладкую кривую, а некоторую угловую форму.
Возможные трудности в реализации включают толстые линии, которые можно решить путем преобразования скелета. Для реализации Matlab скелета и нахождения конечных точек кривой, см. документация по инструментарию обработки изображений Matlab