Адаптивный порог Плохие эффекты бинаризации

Я реализовал несколько методов адаптивной бинаризации, они используют небольшое окно и для каждого пикселя вычисляется пороговое значение. Есть проблемы с этими методами: если мы выберем размер окна слишком мал, мы получим этот эффект (я думаю, причина в том, что размер окна маленький) http://i.piccy.info/i4/3d/bc/773b7df74ff7dadfd11c09372b7e.jpeg

В левом верхнем углу находится исходное изображение, в правом верхнем углу - глобальный пороговый результат. Внизу слева - пример разделения изображения на несколько частей (но я говорю об анализе небольшого пикселя окружения изображения, например, окна размером 10X10). Таким образом, вы можете увидеть результат таких алгоритмов на правом нижнем рисунке, мы получили черную область, но она должна быть белой. Кто-нибудь знает, как улучшить алгоритм для решения этой проблемы?

4 ответа

Решение

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

Идея, которая может сработать, но я не проверял, состоит в том, чтобы попытаться оценить изменения освещения, а затем удалить их перед установкой порога (что является лучшим термином, чем "бинаризация"). Затем проблема переходит от адаптивного порогового определения к поиску хорошей модели освещения.

Если вы знаете что-нибудь об источниках света, вы, конечно, можете построить модель из этого.

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

РЕДАКТИРОВАТЬ: После быстрого тестирования, кажется, что мой "быстрый взлом" на самом деле не будет работать вообще. Подумав об этом, я тоже не очень удивился:)

I = someImage
Ib = blur(I, 'a lot!')
Idiff = I - Idiff
It = threshold(Idiff, 'some global threshold')

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

  1. Возьмите первые N строк в изображении
  2. Создайте среднюю строку из N собранных строк. Вы знаете, есть одна строка в качестве фоновой модели.
  3. Для каждой строки в изображении вычтите строку фоновой модели (средняя строка).
  4. Порог полученного изображения.

К сожалению, я дома без каких-либо хороших инструментов, чтобы проверить это.

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

Другим предложением было бы создать глобальную модель для вашего освещения: я уверен, что в вашем образце изображения вы можете подогнать плоскость (в пространстве X/Y/ яркость) к изображению, используя наименьшие квадраты, а затем разделить пиксели на пиксели ярче (передний план) и темнее этой плоскости (фон). Затем вы можете подогнать отдельные плоскости к фону и пикселям переднего плана, снова порог, используя среднее значение между этими плоскостями, и итеративно улучшить сегментацию. Насколько хорошо это будет работать на практике, зависит от того, насколько хорошо ваша молния может быть смоделирована с помощью линейной модели.

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

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

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

  1. свертывать изображение со средним или медианным фильтром
  2. вычесть исходное изображение из свернутого
  3. порог разница изображения

Метод локального адаптивного порога выбирает индивидуальный порог для каждого пикселя.

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

У вас очень неравномерное освещение и довольно большой объект (таким образом, нет универсального простого способа извлечь фон и исправить неоднородность). По сути, это означает, что вы не можете использовать глобальный порог вообще, вам нужен адаптивный порог.

Вы хотите попробовать бинаризацию Niblack. Код Matlab доступен здесь http://www.uio.no/studier/emner/matnat/ifi/INF3300/h06/undervisningsmateriale/week-36-2006-solution.pdf (стр. 4). Есть два параметра, которые вам нужно настроить вручную: размер окна (N в приведенном выше коде) и вес.

Другие вопросы по тегам