У меня есть черно-белое изображение после бинаризации. После этого у меня есть изображение, как показано ниже:
Как я могу удалить маленькие линии, параллельные длинным кривым, используя OpenCV? Я могу удалить их, удалив все маленькие объекты, но я хочу удалить только маленькую параллель
линий.
Это похоже на артефакт Канни (или какой-то звонкий артефакт) для меня. Есть несколько способов их удалить.
Эмпирическим, но не слишком вычислительным методом было бы найти все мелкие объекты и наложить их на одно и то же изображение, смещенное на [+/-] X, [+/-] Y. Если элемент полностью совпадает со смещенным изображением, то есть все пиксели в белом объекте также являются белыми в смещенном изображении, то вы наверное глядя на артефакт.
Чтобы оценить «малость» функции, вы можете использовать базовую заливку. Этот метод дешев, потому что вы можете смоделировать смещение с помощью указателей, не выделяя четыре смещенных изображения. Он склонен к ложным срабатываниям там, где у вас действительно есть небольшие параллельные линии, и к ложным отрицаниям, если артефакты очень большие.
Другим способом будет постеризация дважды исходного изображения с разными порогами. Пока «настоящие» линии будут оставаться вместе, звенящие артефакты будут иметь различную силу. В этот момент вы оцениваете разницу в изображении и учитываете «артефакт» всех дальше чем заданный порог от дорожки изображения. Это немного сложнее в вычислениях, дает лучшие результаты, но зависит от того, что у вас есть для исходного изображения, т.е. каков ваш рабочий процесс.
Вполне возможно, что переоценка рабочего процесса (изменение фазы обнаружения краев) может полностью исключить создание артефактов.
использование библиотека cvBlobslib обнаруживать белые пятна как сгустки … библиотека cvBlobslib предоставляет функции, с помощью которых вы можете узнать различные свойства сгустков, такие как площадь и эллиптичность … так что если вы хотите, чтобы только небольшие участки были параллельны длинной кривой … затем ..
надеюсь, что это может работать ..
Если вы заранее знаете направление своей линии, вы можете сделать морфологическое закрытие с помощью настраиваемого элемента структурирования, адаптированного к вашим потребностям.
См морфомат на википедия
Смотри opencv документация
Возможно, похоже на то, что говорили другие, но в более простых словах: так как маленькие линии, кажется, имеют примерно половину толщины длинных, если вы действительно не заботитесь о сохранении длинных линий такими, какие они есть, вы можете применить несколько простой алгоритм, который «делает линии тоньше», пока маленькие не исчезнут. Вам нужно сканировать изображение пиксель за пикселем, и когда вы обнаруживаете белый пиксель выше или ниже или слева или справа от черного пикселя, вы сохраняете его координаты в векторе. После того, как вы пройдете все изображение, вы сделаете все пиксели, заданные координатами, вектором черного цвета. Вы можете определить некоторый порог эмпирически для количества итераций этого алгоритма.
Вот шаги, использующие тот факт, что параллельные линии увеличивают плотность ребер.
1) Применить adaptive Threshold
на сером изображении, чтобы получить много краев.
2) Erode
3х3 (или эксперимент, но маленький) Морфологическая операция.
3) Возьми Logical Not
чтобы получить краевую плотность.
4) Применить Dilate
вроде 3х3 или 5х5. Это расширит края, чтобы объединить и сделать область.
5) Сейчас Erode
7×7 (или эксперимент для более высокого, чем последнее расширение) Морфологическая операция. Это удалит большую часть ненужной области, длинных линий и маленьких беспризорных областей.
Выход является МАСКА для удаления области. Вы можете применить обнаружение контуров к исходному изображению и удалить контурный объект для сопоставления положения в маске с высокой точностью удаления.
ИЛИ если вам не нужен высокоточный результат просто And
с маской NOT
,
Почему бы не сделать что-то вроде:
findContours
и фильтр по размеру).Результат, вероятно, будет лучше (и быстрее), если вы сначала скелетонизируете изображение.
Удачи с этим,