2014-10-28 6 views
4

У меня есть изображение, как это (пороговые, удаление шума и т.д. завершено):Как сгладить зубчатую границу изображения в прямую линию?

Original Image

Моего окончательный вывод должен быть изображение без какого-либо неровных краев, и меньше, чем заданное изображение. Под этим я хочу сказать, что единственное различие между двумя изображениями должно быть в том, что в новом, зубчатые края должны быть удалены, а не зубчатые края заполнены. Как и (окончательное изображение должно быть область в пределах красной границы, красная граница показана только для объяснения):

Image showing how final border should be

Я думал о чем-то вдоль линий с помощью Хаф преобразующая или использования разрывов, а затем эрозий, но ничего не работает (вероятно, моя вина, потому что я раньше не слишком подробно разбирался с ними).

Обратите внимание, что язык, который я хотел бы сделать, это MATLAB.

Есть 2 основных цели этого:

  1. Чтобы получить Кромки сам, используя Хаф трансформирует
  2. Так что свойство «экстремумов» возвращает нужные пинты при использовании regionprops, например, так:

enter image description here

вопрос, в более краткой форме:

  1. Как я могу извлечь этот T в MATLAB, чтобы он не имел прочных ребер, но общая цифра не больше оригинала, как показано на втором рисунке выше? Другими словами, какой набор преобразований (в MATLAB) я использовал бы, чтобы сгладить границы изображения с минимальной площадью, потерянной как можно меньше (но не добавленной области), так что прочность исчезает?
  2. Есть ли более эффективный способ извлечения угловых (экстремальных) точек, как показано на рисунке 2 выше, без необходимости проходить этап 1?

EDIT: больше Несколько образцов изображения:

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

Вот несколько изображений, для справки:

reference image 2 reference image 3, proof of my not-so-great GIMP skills

+2

Каков ваш вопрос? – Celeo

+0

Извините. Я обновил вопрос, чтобы вопрос выделялся больше –

+1

Можете ли вы показать некоторые изображения, для которых вы хотите, чтобы этот алгоритм работал. Я думаю, что относительно легко написать код, который работает для этого изображения, но его сложно обобщить, или вам не нравится только этот образ? –

ответ

2

Я не уверен, если мой ответ будет удовлетворять ваши требования. Я делаю это здесь, потому что думаю, что слишком долго для комментария.

  • Поскольку вы хотите, чтобы конечный результат был меньше входного изображения, выровняйте входное изображение. Вы можете выбрать подходящий размер ядра.
  • выполнить обнаружение угла на этом эродированном изображении. Это даст вам все сильные углы, но без каких-либо заказов.
  • отслеживать границы эродированного изображения. Это должно дать вам упорядоченный список граничных пикселей
  • сейчас, с помощью этих упорядоченных граничных точек вы можете заказать углы, найденные вами ранее.
  • угловые точки фильтра, которые образуют угол приблизительно 90 градусов. Вы можете сделать это, учитывая каждую 3 упорядоченные угловые точки (две зеленые точки и красная точка между ними на изображении ниже. Это просто для иллюстрации, а не для угловых точек, которые я вычислил. В конце этой операции у вас есть все красные точки в изображение, ниже которого находятся в сильных углах, в дополнение к другим желтым и зеленым угловых точек)
  • теперь вы можете либо найти уравнение линии, соединяющей 2 последовательных красные точки

или

  • подходят к линии наименьших квадратов к точкам между (и включая) каждые две последовательные красные точки

  • , так как вы сделали всю эту обработку на размытое изображение, которое существенно меньше, чем исходное изображение, вы должны получить меньшую форму

enter image description here