Удалить фоновый цвет при обработке изображений для распознавания текста - PullRequest
6 голосов
/ 01 апреля 2011

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

enter image description here

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

Кроме того, что, если я также хочу удалить фиолетовые буквы (название театра) и строку, чтобы сохранить только черные буквы? Простая обрезка может не сработать, потому что фиолетовые буквы могут появляться и в других местах.

Я ищу решение в программировании, а не через такие инструменты, как Photoshop.

Ответы [ 6 ]

7 голосов
/ 01 апреля 2011

Это можно сделать с помощью GIMP (или любого другого инструмента для редактирования изображений).

  1. Откройте ваше изображение
  2. Преобразовать в оттенки серого
  3. Дублируйте слой
  4. Применение размытия по Гауссу с использованием большого ядра (10x10) к верхнему слою
  5. Рассчитать разницу изображения между верхним и нижним слоем
  6. Порог изображения для получения двоичного изображения

размытое изображение:

enter image description here

Разница изображения:

enter image description here

Binary:

enter image description here

Если вы делаете это как раз, GIMP, вероятно, достаточно хорош. Если вы собираетесь делать это много раз, вы, вероятно, могли бы написать скрипт imagemagick или написать код для вашего подхода, используя что-то вроде Python и OpenCV.

Некоторые проблемы с вышеуказанным подходом:

  • Фиолетовый текст (CENTURY) теряется, потому что он не такой контрастный, как другой текст. Вы можете обойти это, по-разному присваивая пороги различным частям изображения или используя методы локальной гистограммы
5 голосов
/ 04 апреля 2011

Ниже показана возможная стратегия обработки вашего изображения и распознавания его

Последний шаг - это OCR. Моя процедура распознавания является ОЧЕНЬ базовой, поэтому я уверен, что вы можете получить лучшие результаты.

Код Mathematica код.

enter image description here

Совсем неплохо!

3 голосов
/ 01 апреля 2011

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

Этот метод работает, если текст темнее, чем фон (в каждом компоненте цвета). В противном случае вы можете инвертировать цвета и применить этот метод.

1 голос
/ 18 января 2018

В Imagemagick вы можете использовать для этого функцию -lat.

convert image.jpg -colorspace gray -negate -lat 50x50+5% -negate result.jpg

enter image description here

convert image.jpg -colorspace HSB -channel 2 -separate +channel \
-white-threshold 35% \
-negate -lat 50x50+5% -negate \
-morphology erode octagon:1 result2.jpg

enter image description here

1 голос
/ 01 апреля 2011

Если ваше изображение захвачено как RGB, просто используйте зеленое изображение или быстро конвертируйте шаблон Байера, который, вероятно, @ misha's преобразовывает в решения в оттенках серого , вероятно, делают.

0 голосов
/ 18 января 2018

Надеюсь, это кому-нибудь поможет

Использование однострочного кода, который вы можете получить, это использование OpenCV и python

#Load image as Grayscale
im = cv2.imread('....../Downloads/Gd3oN.jpg',0)
#Use Adaptivethreshold with Gaussian
th = cv2.adaptiveThreshold(im,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,11,2)

Вот результат

enter image description here

Вот ссылка для Определение порога изображения в OpenCV

...