Ответ 1
Приложение для каскадеров может использовать какой-то сложный алгоритм для обработки различных случаев молнии и т.д. Но я попытаюсь осветить базовый подход к такой проблеме. Основная идея здесь - Бинаризация данного ввода image, или, точнее, мы можем сказать Порог заданное изображение. Если вы посмотрите на документацию OpenCV, существует множество ссылок на пороговое значение данного изображения. Поэтому давайте начнем с документация.
-
Глобальный порог. В этом подходе мы предполагаем, что значение интенсивности переднего плана всегда ниже определенного значения. В контексте печатных листов мы предполагаем, что цвет чернил всегда черный и цвет бумаги является однородным, а интенсивность больше, чем интенсивность цвета чернил, поэтому мы надежно принимаем некоторый порог (скажем, 40), (макс. 255) и порог входного изображения как:
ret, thresh1 = cv2.threshold(img, 100, 255, cv2.THRESH_BINARY)
ret, thresh1 = cv2.threshold(img, 130, 255, cv2.THRESH_BINARY)
Существует много недостатков этого метода: во-первых, он НЕ не зависит от дисперсии интенсивности. Поэтому вероятность того, что вы можете точно оценить пороговое значение, которое отделяет текст от данного изображение, оно имеет очень ограниченные приложения, может применяться только в том случае, если фоновая бумага точно белая с минимальным изменением интенсивности, поэтому этот процесс нельзя использовать для изображений Real world.
-
Адаптивное пороговое значение. Этот метод охватывает проблему изменения интенсивности в данном изображении, здесь пороговое значение выполняется для значений соседних пикселей, поэтому переходы от меньшей интенсивности к высшей и наоборот успешно захвачены этим методом как:
thresh = cv2.adaptiveThreshold(original_img, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2)
Дальнейшая работа. Вы можете работать с различными методами шумоподавления двоичного изображения, удалять точки, или посмотреть на удаление соляных и перцовых шумов с изображения.
-
Бинаризация Otu. Это еще один приятный подход, который интеллектуально вычисляет пороговое значение между максимами. В некоторых случаях он может работать очень хорошо, но, похоже, ваш случай.
ret2,thresh = cv2.threshold(img,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
В основном он делает то же самое глобальное пороговое значение. Но теперь пороговое значение рассчитывается автоматически таким образом, что порог лежит между 2 пиками и, следовательно, сегментирует чернила из бумаги.
Рекомендуемый метод: Я думаю, что наилучшим подходом для начала является Adaptive Thresholding, вы можете попробовать некоторые другие методы предварительной обработки, такие как резкость изображения, Уравнивание гистограммы и т.д. и проанализируйте, как он создает более реалистичный вывод. Вы также можете попытаться выполнить некоторую пост-обработку, такую как шумоподавление изображения, Морфологические операции
Я попытался разобрать изображение и нашел его более эффективным для других подходов,
denoised = cv2.fastNlMeansDenoising(thresh, 11, 31, 9) # you may experiment with the constants here
Но я приветствую вас, чтобы попробовать различные комбинации вышеупомянутых подходов, чтобы посмотреть, какой из них работает для всех случаев.