Как я могу удалить небольшую параллельную линию на изображении?

У меня есть черно-белое изображение после бинаризации. После этого у меня есть изображение, как показано ниже:

http://ifotos.pl/zobacz/ipng_xhnxhrh.png/

Как я могу удалить маленькие линии, параллельные длинным кривым, используя OpenCV? Я могу удалить их, удалив все маленькие объекты, но я хочу удалить только маленькую параллель
линий.

3

Решение

Это похоже на артефакт Канни (или какой-то звонкий артефакт) для меня. Есть несколько способов их удалить.

Эмпирическим, но не слишком вычислительным методом было бы найти все мелкие объекты и наложить их на одно и то же изображение, смещенное на [+/-] X, [+/-] Y. Если элемент полностью совпадает со смещенным изображением, то есть все пиксели в белом объекте также являются белыми в смещенном изображении, то вы наверное глядя на артефакт.

Чтобы оценить «малость» функции, вы можете использовать базовую заливку. Этот метод дешев, потому что вы можете смоделировать смещение с помощью указателей, не выделяя четыре смещенных изображения. Он склонен к ложным срабатываниям там, где у вас действительно есть небольшие параллельные линии, и к ложным отрицаниям, если артефакты очень большие.

Другим способом будет постеризация дважды исходного изображения с разными порогами. Пока «настоящие» линии будут оставаться вместе, звенящие артефакты будут иметь различную силу. В этот момент вы оцениваете разницу в изображении и учитываете «артефакт» всех дальше чем заданный порог от дорожки изображения. Это немного сложнее в вычислениях, дает лучшие результаты, но зависит от того, что у вас есть для исходного изображения, т.е. каков ваш рабочий процесс.

Вполне возможно, что переоценка рабочего процесса (изменение фазы обнаружения краев) может полностью исключить создание артефактов.

2

Другие решения

использование библиотека cvBlobslib обнаруживать белые пятна как сгустки … библиотека cvBlobslib предоставляет функции, с помощью которых вы можете узнать различные свойства сгустков, такие как площадь и эллиптичность … так что если вы хотите, чтобы только небольшие участки были параллельны длинной кривой … затем ..

  1. Получите длинную кривую на основе области, покрытой сгустком или предварительным метром, то есть контурной длиной сгустка …
  2. Получите эллиптичность или ориентацию большой оси длинной кривой после подгонки эллипса (библиотека cvBlobslib сделает это за вас .. !!) …
  3. Отфильтруйте все те пятна, которые меньше порогового значения с точки зрения площади или контура, и имеют ту же ориентацию, что и длинная кривая….

надеюсь, что это может работать ..

2

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

См морфомат на википедия

Смотри opencv документация

1

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

1

Вот шаги, использующие тот факт, что параллельные линии увеличивают плотность ребер.

1) Применить adaptive Threshold на сером изображении, чтобы получить много краев.

2) Erode 3х3 (или эксперимент, но маленький) Морфологическая операция.

3) Возьми Logical Not чтобы получить краевую плотность.

4) Применить Dilate вроде 3х3 или 5х5. Это расширит края, чтобы объединить и сделать область.

5) Сейчас Erode 7×7 (или эксперимент для более высокого, чем последнее расширение) Морфологическая операция. Это удалит большую часть ненужной области, длинных линий и маленьких беспризорных областей.

Выход является МАСКА для удаления области. Вы можете применить обнаружение контуров к исходному изображению и удалить контурный объект для сопоставления положения в маске с высокой точностью удаления.
ИЛИ если вам не нужен высокоточный результат просто And с маской NOT,

1

Почему бы не сделать что-то вроде:

  1. Найти длинные кривые (используя findContours и фильтр по размеру).
  2. Найдите маленькие кривые
  3. Для каждой длинной кривой рассчитайте минимальное расстояние между каждой точкой каждой маленькой кривой и длинной кривой.
  4. Рассчитайте среднее значение и стандартное отклонение этих минимальных расстояний.
  5. Отклоните маленькие кривые, для которых среднее минимальное расстояние до длинной кривой слишком велико, или маленькие кривые, для которых стандартное отклонение минимальных расстояний велико.

Результат, вероятно, будет лучше (и быстрее), если вы сначала скелетонизируете изображение.

Удачи с этим,

0