Адаптивный порог с размытым изображением

Я нахожусь в поиске лучшего метода адаптивного порога для бинаризации изображения. Но у меня проблемы с темным и размытым изображением.
Входное изображение:
Пусть изображение загружается

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

Это не хорошо для меня!
Итак, кто-то может помочь мне решить эту проблему?


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

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

первое кажется очень плохим с @Hammer'solution (я должен выбрать канал c), второе я могу использовать нормальный адаптивный порог.
поэтому я хочу найти лучшее решение для всех случаев.

Еще раз спасибо!

4 ответа

Кажется, что цвет является гораздо лучшим показателем сегментации в вашем изображении, чем интенсивность. Попробуйте преобразовать его в HSV и затем запустить OTSU на канале H.

в питоне

hsv = cv2.cvtColor(image, cv2.cv.CV_BGR2HSV)
cv2.imshow('hsv', hsv[:,:,0])
(thresh, im_bw) = cv2.threshold(hsv[:,:,0], 128, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)
cv2.imshow('OTSU', im_bw)

дает (хсв)

а потом (ОЦУ)

Немного размывает и расширяет, и вы должны быть хорошими, чтобы идти

Возможно, вас заинтересуют эти адаптивные пороги, используемые openCV.

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

# Smooth image
filtered = cv2.adaptiveThreshold(input_image.astype(np.uint8), 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 41, 3)

# Some morphology to clean up image
kernel = np.ones((5,5), np.uint8)
opening = cv2.morphologyEx(filtered, cv2.MORPH_OPEN, kernel)
closing = cv2.morphologyEx(opening, cv2.MORPH_CLOSE, kernel)

Результаты:

Следующий код...

im=cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY,111,3)
cv2.imshow('mkm',im)`

... дает хороший результат:

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

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

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

Немного размыть оба изображения, чтобы повысить достоверность.

Тогда используйте 2 изображения как семена для Водораздела.

Вот ответ, где это сделано

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