Адаптивная пороговая бинаризация: постобработка для удаления объектов-призраков

Кто-нибудь знает об алгоритмах постобработки для удаления объектов-призраков из бинаризованного изображения? Проблема: когда я преобразовываю изображение в двоичную форму, используя, например, метод niblack или bernsen, он производит много шума. Я пишу в Красной книге или в Интернете статьи о бинаризации, и все они говорят, что в Niblack и других методах бинаризации необходим шаг постобработки, но они не говорят, что это, операция постобработки. Так что, пожалуйста, если кто-то знает, тел. РЕДАКТИРОВАТЬ: Исходное изображение:

http://i.piccy.info/i4/20/63/b970ab2ca66e997f421e969a1657.bmp

Порог Бернсена winsize 31, контраст 15:

http://i.piccy.info/i4/32/55/2f1e0293311119986bd49529e579.bmp

Порог Бернсена winsize 31, контраст контрастности 31:

http://i.piccy.info/i4/2a/13/774508890030b93201458986bbd2.bmp

Размер окна метода Niblack-15, k_value 0.2:

http://i.piccy.info/i4/12/4f/fa6fc09bcba7a7e3245d670cbfa5.bmp

Размер окна метода Ниблэк-31, k_value 0.2:

http://i.piccy.info/i4/c0/fd/1f190077abba2aeea89398358fc0.bmp

РЕДАКТИРОВАТЬ 2: Как вы видите, порог Niblack делает много шума. И если я уменьшу размер окна, черные квадраты станут немного белыми внутри. Бернсен лучше - меньше шума, но даже если я увеличу контрастность, но есть одна проблема, я просто не могу создать изображение прямо сейчас, на словах, проблема: если изображение содержит некоторые объекты с цветом, близким к белому цвет, а фон - белый, поэтому, если есть область (например, линия) с черным цветом, этот метод игнорирует объекты, и результат неверен. Это объясняется тем, что метод Бернсена использует эту формулу: для каждого пикселя вычисляют разницу контрастности diff = Maximum_grayscale_value - Minim_grayscale_value, а затем diff используется для вычисления порогового значения, но в случае, который я написал выше, у нас максимальное значение 255 и минимальное значение 0. Таким образом, порог будет 128, но фактический цвет объекта выше 128 (около белого цвета).

Поэтому мне нужно использовать некоторые операции постобработки для правильной бинаризации. Какие-нибудь мысли?

3 ответа

Решение

Завершите программу на Python, используя K-means, инструмент, предназначенный для поиска оптимальных интервалов квантования:

from scipy.misc import imread, imsave
def kmeans(file_in, file_out, maxiter):
    X = imread(file_in)
    thresh = X.mean()
    for iter in range(maxiter):
        thresh = (X[X<thresh].mean() + X[X>=thresh].mean())/2.0
    X[X<thresh] = 0
    X[X>=thresh] = 255
    imsave(file_out, X)
    return X, thresh

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

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

Выход:

http://up.stevetjoa.com/binary.bmp

Похоже, что ваша проблема - это проблема сегментации... какие типы изображений вы прокачиваете?

Кстати, как я могу прокомментировать вопрос, а не отвечать на него?

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

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