Я реализовал некоторые адаптивные методы бинаризации, они используют маленькое окно, и на уровне каждого пикселя вычисляется пороговое значение. Существуют проблемы с этими методами: Если мы выберем размер окна, слишком маленький, то мы получим этот эффект (я думаю, что причина из-за размера окна, является маленьким),
(источник: piccy.info)
В левом верхнем углу существует исходное изображение, правильный верхний угол - глобальный пороговый результат. Левая нижняя часть - пример делящегося изображения к некоторым частям (но я говорю об анализе пикселя изображения маленькое окружение, например, окно размера 10X10). Таким образом, Вы видите результат таких алгоритмов в нижнем правом изображении, мы получили черную область, но это должно быть бело. Кто-либо знает, как улучшить алгоритм для решения этой проблемы?
В C:
#include <string.h> // memcpy
#include <stdlib.h> //realloc
В C++ удалите .h
и префикс c
. В C++ они будут помещены в пространство имен std
, но также будут глобальными.
Я не думаю, что это будет работать с Adroner, но вы можете разместить содержимое над элементом управления WebBroswer с помощью прозрачного элемента управления Popup. Более подробную информацию и образец кода можно найти здесь .
-121--4268351-В этой области проводится довольно много исследований, но, к сожалению, у меня нет хороших ссылок.
Идея, которая может работать, но я не проверял, состоит в том, чтобы попытаться оценить изменения освещения, а затем удалить это перед порогом (что является лучшим термином, чем «бинаризация»). Затем проблема переходит от адаптивного порогового значения к поиску хорошей модели освещения.
Если вы знаете что-либо об источниках света, вы, конечно, могли бы построить модель из этого.
В противном случае быстрый взлом, который может сработать, это применить к вашему изображению действительно тяжелый фильтр нижних частот (размыть его), а затем использовать его в качестве модели освещения. Затем создайте разностное изображение между исходной и размытой версией и пороговое значение.
EDIT : После быстрого тестирования оказалось, что мой «быстрый взлом» вообще не идти на работу. Подумав об этом, я тоже не очень удивляюсь:)
I = someImage
Ib = blur(I, 'a lot!')
Idiff = I - Idiff
It = threshold(Idiff, 'some global threshold')
EDIT 2 Есть еще одна идея, которая может работать в зависимости от того, как генерируются ваши изображения. Попробуйте оценить модель освещения из первых нескольких строк на изображении:
К сожалению, у меня дома нет хороших инструментов для проверки этого.
Похоже, вы неправильно используете адаптивную пороговую обработку. Ваши изображения выглядят так, как если бы вы разделили свое изображение на небольшие блоки, вычислили порог для каждого блока и применили этот порог ко всему блоку. Это объяснило бы артефакты "коробки". Обычно адаптивная установка пороговых значений означает нахождение порогового значения для каждого пикселя отдельно с отдельным окном, центрированным вокруг пикселя.
Еще одно предложение - создать глобальную модель освещения: я почти уверен, что в образце изображения вы можете разместить плоскость (в пространстве X / Y / яркости) с помощью метода наименьших квадратов, а затем разделить пиксели в пиксели ярче (передний план) и темнее, чем эта плоскость (фон). Затем вы можете подогнать отдельные плоскости к пикселям фона и переднего плана, установить порог, снова используя среднее значение между этими плоскостями, и итеративно улучшить сегментацию. Насколько хорошо это будет работать на практике, зависит от того, насколько хорошо вашу молнию можно смоделировать с помощью линейной модели.
Если на самом деле объекты, которые вы пытаетесь сегментировать, «тоньше» (вы сказали что-то о штрих-кодах в комментарии), вы можете попробовать простую операцию открытия / закрытия, чтобы получить модель освещения. (т.е. закройте изображение, чтобы удалить пиксели переднего плана, затем используйте [закрытое изображение + X] в качестве порогового значения).
Или вы можете попробовать фильтрацию со средним сдвигом, чтобы добиться одинаковой яркости пикселей переднего и заднего плана. (Лично я бы сначала попробовал это)
У вас очень неравномерное освещение и довольно большой объект (поэтому нет универсального простого способа извлечь фон и исправить неравномерность). Это означает, что вы не можете использовать глобальное пороговое выделение вообще, вам нужно адаптивное пороговое выделение.
Вы хотите попробовать бинаризацию Niblack. Код Matlab доступен здесь http://www.uio.no/studier/emner/matnat/ifi/INF3300/h06/undervisningsmateriale/week-36-2006-solution.pdf (страница 4). Есть два параметра, которые вам придется настраивать вручную: размер окна (N в приведенном выше коде) и вес.