Повышение точности линии Хафа/сегментации книжных корешков с помощью OpenCV и C++

Я пытаюсь сделать сегментацию на основе корешков книги. У меня уже давно проблемы. Два изображения ниже являются примером неудачной сегментации с использованием линий Хафа. Я пытаюсь провести черту между всеми книгами.

Я также пробовал HoughLineP, который на самом деле дает худшие результаты. Я попытался настроить все параметры HoughLine и HoughLineP. Но я не могу улучшить скорость обнаружения. или даже ухудшить неправильное обнаружение.

введите здесь описание изображениявведите здесь описание изображения

Я хочу спросить, есть ли у кого-нибудь идеи, как разделить книжные корешки? Я пробовал методы предварительной обработки, но они объединяют книжные корешки одного цвета вместе, я думал попытаться найти черные линии в середине книг, так как они имеют тенденцию быть немного темнее, но если вы посмотрите на книгу Сета Година и передовой рекламы, я не вижу никакого разрыва между ними.

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

Последняя программа, которую я хочу сделать, это подсчет количества книг. но для этого мне прежде всего нужна чистая и успешная сегментация.

У кого-нибудь есть другие методы, которые я могу попробовать? Буду очень признателен за все отзывы, комментарии и ответы. Я застрял на этом уже больше месяца. Спасибо.


person rockinfresh    schedule 15.10.2013    source источник


Ответы (2)


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

Можно использовать такой сверточный фильтр:

-1 0 1
-1 0 1
-1 0 1
person Drew Noakes    schedule 15.10.2013
comment
Спасибо. Я попробую сегодня и сообщу вам результат. Тем не менее, я хочу попросить, чтобы книги того же цвета были сложены вместе, как книга Сета Годвина и передовая рекламная книга, острые края не смогли разделить эти две книги, как показано в вопросе. Любая идея, как я могу сделать Canny более эффективным, чтобы разделить их? - person rockinfresh; 17.10.2013
comment
Я считаю, что следует избегать обнаружения Canny, поскольку оно находит края под любым углом. Вас интересуют только вертикальные края, поэтому их можно изолировать с помощью другого фильтра. Вы можете использовать Gimp, чтобы самостоятельно поэкспериментировать с различными типами обнаружения границ. Загруженное вами изображение представляет собой сглаженный GIF-файл, который не подходит для обнаружения границ, поскольку содержит много шума. Является ли ваше входное изображение GIF? - person Drew Noakes; 17.10.2013
comment
Неа. Мое входное изображение - это все файлы PNG или JPEG, хотя изображение, загруженное в вопросе, - это GIF. Спасибо за предложение Gimp. Я проверяю это сейчас. Я буду экспериментировать с различными фильтрами и надеюсь скоро вернуться к вам, если это сработает, в последнее время я был занят в школе. Спасибо за совет! - person rockinfresh; 18.10.2013

Я предпочел бы прокомментировать, чем ответить, но...

Не забудьте удалить край, найденный после обнаружения каждого, и повторите обнаружение края. Также вы можете проверять пики на предмет их относительной силы и повторять только тогда, когда их становится труднее выделить.

В последнее время я выполняю обнаружение краев нелинейным способом, находя градиент во всех восьми направлениях и беря максимальное из них в качестве выходных данных для каждого пикселя. Затем повторите для каждого цвета, когда это цветное изображение. Это легко в Matlab, но я не знаком с Visual Studio.

Радоваться, веселиться!

person Jason    schedule 12.11.2013
comment
Я также сейчас изучаю обработку изображений в MatLab. Все еще новичок в отношении MatLab. У вас есть пример/учебник/код, на который я могу сослаться? Я буду очень признателен. Спасибо. - person rockinfresh; 16.11.2013
comment
В настоящее время у меня нет кода или Matlab, но я просто использую матричные манипуляции, тогда алгоритмы Matlab вступят во владение. Хотя есть улучшение времени обработки для многопроцессорных компьютеров, которое необходимо включить в Matlab. Это находится в файле справки Matlab для пакета обработки изображений ... возможно, страница справки функции преобразования hough укажет на это. - person Jason; 19.11.2013
comment
В python используются только четыре точки вместо восьми, Edges = max(numpy.abs(A[0:-1,0:-1,:] - A[0:-1,1:,:]),numpy.abs (A[0:-1,0:-1,:] - A[1:,0:-1,:]),numpy.abs(A[0:-1,0:-1,:] - A [1:,1:,:]),numpy.abs(A[1:,0:-1,:] - A[0:-1,1:,:])) тогда maxEdges = max(A[: ,:,0],A[:,:,1],A[:,:,2]), где A — это изображение в виде массива или матрицы в данном случае. - person Jason; 19.11.2013