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

Я реализовал некоторые адаптивные методы бинаризации, они используют маленькое окно, и на уровне каждого пикселя вычисляется пороговое значение. Существуют проблемы с этими методами: Если мы выберем размер окна, слишком маленький, то мы получим этот эффект (я думаю, что причина из-за размера окна, является маленьким), alt text
(источник: piccy.info)

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

5
задан Glorfindel 17 June 2019 в 16:04
поделиться

3 ответа

В C:

#include <string.h> // memcpy
#include <stdlib.h> //realloc

В C++ удалите .h и префикс c . В C++ они будут помещены в пространство имен std , но также будут глобальными.

-121--2520862-

Я не думаю, что это будет работать с Adroner, но вы можете разместить содержимое над элементом управления WebBroswer с помощью прозрачного элемента управления Popup. Более подробную информацию и образец кода можно найти здесь .

-121--4268351-

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

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

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

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

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

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

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

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

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

2
ответ дан 14 December 2019 в 13:34
поделиться

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

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

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

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

2
ответ дан 14 December 2019 в 13:34
поделиться

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

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

1
ответ дан 14 December 2019 в 13:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: