Как удалить определенный фон с изображения?


11

оранжевый

Это было изображение, полученное после фильтрации Габора ... Есть ли какой-то способ удаления линий внутри изображения, кроме ярко-белого округлого дефекта.

Попробовал другую ориентацию фильтра Габора пойти следующий результат:

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

После порога: что достаточно хорошо, но не отлично

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

После медианной фильтрации:

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

заранее спасибо


2
Хорошая работа с медианным фильтром. Ты уже в пути.
Откат

Это похоже на хороший сценарий применения диффузионного фильтра. Кроме того , попробуйте спросить в: <br/> dsp.stackexchange.com/ <br> photo.stackexchange.com/ <br>
Дэнни Varod

Применяли ли вы медианный фильтр после порога? Если так, попробуйте без порога.
Дэнни Варод

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

Ответы:


12

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

  1. Binarize ваше второе изображение с любым автоматическим алгоритмом порога. Диапазон порогов, которые будут работать, велик, как вы увидите.

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

  3. Рассчитайте для каждого компонента вашего изображения свойство, которое описывает, насколько близок ваш объект к закрашенному кругу. Для этого вы можете использовать, например, компактность . Я использовал ниже долю пикселей в пределах эквивалентного радиуса диска . Этот радиус - это радиус диска с той же площадью, что и у вашего объекта.

    1. Площадь просто подсчитывает количество пикселей вашего объекта
    2. Расчет радиуса круга с учетом его площади тоже должен быть управляемым
    3. Для пикселя внутри этого радиуса вам необходим центр каждого объекта изображения, но это просто среднее значение всех положений объекта-пикселей. Если вы физик, то вы знаете центр масс нескольких точечных масс. Это эквивалентно.
    4. Теперь вы рассчитываете для каждого пикселя каждого объекта расстояние от его центра и проверяете, меньше ли он радиуса круга. Разделив два числа, вы получите долю внутреннего и внешнего пикселя.
  4. Возьмите объект с наибольшей долей. Примечание: объекты с одним пикселем получат значение 1. Поэтому вы должны установить порог размера и брать только объекты большего размера, скажем, 10 пикселей.

Чтобы увидеть, что автоматическая бинаризация должна работать, вот результаты для очень низкого и очень высокого порога:

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

Обновление маркировки компонентов

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

Процесс маркировки этого объекта меткой в ​​основном похож на заливку. Это на сайте Wikipedia внутренние шаги 1-4 в алгоритме. Вы начинаете с этого помеченного пикселя и помещаете всех его соседей в стек (они использовали вектор ). Для пикселя в стеке вы проверяете, является ли он передним планом и еще не помечен. Если вам нужно пометить его, вы снова поместите все его соседи в стек. Делайте это, пока ваш стек не станет пустым.

Затем продолжите сканирование по изображению. В отличие от описания на вики-сайте, вам не нужно удалять пиксель из вашего исходного изображения, вы просто пропускаете, когда у вас есть значение, отличное от 0 в вашем label-image.


какой алгоритм маркировки компонентов вы используете здесь?
Вина

1
@vini, я обновил свой пост. Фонон, спасибо. Мы используем много морфологических мер и особенно компактность была очень полезна некоторое время назад.

да здорово получилось :)
vini

6

Несколько идей:

  1. Отфильтруйте края в зависимости от плотности краев. Используя аппроксимацию круглого ядра, найдите среднее значение прочности края (или какую-либо другую меру). Пройдите через любые ребра в пределах или выше порогового значения, установите черный цвет для любых ребер ниже порогового значения.
  2. Используйте морфологическую операцию «закрыть» (расширение с последующей эрозией), чтобы очистить изображение, затем используйте алгоритм маркировки области (он же связанный компонент, большие двоичные объекты), чтобы найти все большие двоичные объекты. Фильтрация данных BLOB-объектов по размеру, соотношению основных и вспомогательных осей и т. Д.
  3. Попробуйте Гауссово размытие, найдите порог бинаризации, чтобы отделить свет от темноты, а затем отфильтруйте пятна, как описано в шаге 2 выше. (Для быстрого приближения к размытию по Гауссу сожмите веки в основном и плотно прищурите изображение)
  4. Попробуйте несколько фильтров в Photoshop или GIMP.

РЕДАКТИРОВАТЬ: после вашего среднего шага фильтрации, вы большую часть пути там. Молодец! Пункт 2, который я предложил выше (закрытие, затем маркировка региона), - это один из методов, который поможет вам пройти оставшуюся часть пути.


да будет стараться, что позволит вам знать, что происходит
Vini

1

Вы можете попробовать активные контуры. Хотя он может быть медленным, он может справиться с таким сложным случаем.

Или вы можете использовать некоторые предварительные знания для обработки этого изображения. Например, вы знаете, что объект BLOB-объектов «большой» и «связанный». Таким образом, когда вы посчитаете номер каждого подключенного региона, вы можете найти его.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.