Чтобы получить полученное изображение с почти соприкасающимися горизонтальными и вертикальными линиями и прямоугольниками:
- Преобразовать в двоичный файл (т.е. все строки
белые, остальное черное)
- Выполните двоичное расширение (здесь вы делаете каждый пиксель, который касается белого пикселя в исходном изображении или является белым пикселем в исходном изображении, белым. Касание только прямое (поэтому каждый пиксель "касается") пикселей слева, справа, сверху и снизу) это называется «4-х подключен»
- повторите шаг 3 несколько раз, если промежутки между концами больше 2 пикселей в ширину, но не слишком часто!
- Выполните операцию скелета (здесь вы делаете каждый пиксель в выходном изображении черным, если это белый пиксель в исходном изображении, который касается хотя бы одного черного пикселя, а белые пиксели, которых он касается (в исходном изображении), касаются друг друга Снова коснитесь определенного с 4-связностью. См. Образец ниже.
- Повторите шаг 4, пока изображение не изменится после повтора (все белые пиксели являются концами линий или разъемами)
Это, если повезет, сначала покажет прямоугольники с толстыми жирными линиями, оставив толстые жировые артефакты по всему изображению (после шага 3), а затем, после шага 5, все толстые артефакты будут удалены, а все коробки остаются. Вам нужно настроить количество повторов на шаге 3 для достижения наилучших результатов. Если вам интересна морфология изображения, это книга действительно хорошего вводного курса, который я прошел.
Пример: (0 = черный, 1 = белый, учитываются пиксели в центре каждого блока 3x3, ввод слева, вывод справа)
011 => 011
011 => 001 all other white pixels touch, so eliminate
011 => 011
010 => 010
010 => 010 top pixel would become disconnected, so leave
010 => 010
010 => 010
010 => 000 touches only one white pixel, so remove
000 => 000
010 => 010
111 => 111 does not touch black pixels, leave
010 => 010
010 => 010
011 => 011 other pixels do not touch. so leave
000 => 000