Базовое объяснение наиболее широко используемых методов предварительной обработки в системе OCR.

Добро пожаловать в часть II из серии о работе системы оптического распознавания текста. В предыдущем посте мы кратко обсудили различные этапы системы распознавания текста.

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

Пойдем…

Основная цель этапа Предварительная обработка - максимально упростить для системы распознавания символов отличать символ / слово от фона.

Вот некоторые из самых основных и важных техник предварительной обработки: -

1) Бинаризация
2) Коррекция перекоса
3) Удаление шума
4) Истончение и скелетонизация

Прежде чем обсуждать эти методы, давайте разберемся, как система распознавания текста распознает изображение. Для системы OCR Изображение - это многомерный массив (2D-массив, если изображение в оттенках серого (или) двоичное, 3D-массив, если изображение цветное). Каждая ячейка в матрице называется пикселем и может хранить 8-битное целое число, что означает, что диапазон пикселей составляет 0–255.

Давайте рассмотрим каждый метод предварительной обработки, упомянутый выше, один за другим.

  1. Бинаризация. С точки зрения непрофессионала бинаризация означает преобразование цветного изображения в изображение, состоящее только из черных и белых пикселей (значение черного пикселя = 0 и Значение белого пикселя = 255). Как правило, это можно сделать, установив порог (обычно порог = 127, так как это ровно половина диапазона пикселей 0–255). Если значение пикселя превышает пороговое значение, он рассматривается как белый пиксель, в противном случае - как черный пиксель.

Но эта стратегия не всегда может дать желаемый результат. В случаях, когда условия освещения на изображении неоднородны, этот метод не работает.

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

Метод локальных максимумов и минимумов:

C (i, j) - порог для определенного размера местоположения на изображении (например, 10x10 размер части). Используя эту стратегию, мы получим разные пороговые значения для разных частей изображения в зависимости от условий окружающего освещения, но переход не такой плавный.

Бинаризация Оцу: этот метод дает порог для всего изображения с учетом различных характеристик всего изображения (например, условий освещения, контрастности, резкости и т. Д.), И этот порог используется для бинаризации изображения.
Это можно сделать с помощью OpenCV python следующим образом:

ret, imgf = cv2.threshold(img, 0, 255,cv2.THRESH_BINARY,cv2.THRESH_OTSU) #imgf contains Binary image

- ›Adaptive Thresholding: этот метод дает порог для небольшой части изображения в зависимости от характеристик его местоположения и соседей, т.е. нет единого фиксированного порога для всего изображения, но для каждой небольшой части изображение имеет разный порог в зависимости от местности, а также дает плавный переход.

imgf = cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,11,2) #imgf contains Binary image

2. Коррекция перекоса. При сканировании документа он может быть немного перекосом (изображение выровнено под определенным углом по горизонтали). При извлечении информации из отсканированного изображения решающее значение имеет обнаружение и исправление перекоса.
Для исправления перекоса используется несколько методов.

→ Метод профиля проекции
→ Метод преобразования Хафа
→ Метод Topline
→ Метод Scanline

Однако метод профиля проекции - это самый простой, легкий и наиболее широко используемый способ определения перекоса в документах.

В этом методе сначала мы берем двоичное изображение, затем

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

import sys
import matplotlib.pyplot as plt
import numpy as np
from PIL import Image as im
from scipy.ndimage import interpolation as inter
input_file = sys.argv[1]
img = im.open(input_file)
# convert to binary
wd, ht = img.size
pix = np.array(img.convert('1').getdata(), np.uint8)
bin_img = 1 - (pix.reshape((ht, wd)) / 255.0)
plt.imshow(bin_img, cmap='gray')
plt.savefig('binary.png')
def find_score(arr, angle):
    data = inter.rotate(arr, angle, reshape=False, order=0)
    hist = np.sum(data, axis=1)
    score = np.sum((hist[1:] - hist[:-1]) ** 2)
    return hist, score
delta = 1
limit = 5
angles = np.arange(-limit, limit+delta, delta)
scores = []
for angle in angles:
    hist, score = find_score(bin_img, angle)
    scores.append(score)
best_score = max(scores)
best_angle = angles[scores.index(best_score)]
print('Best angle: {}'.formate(best_angle))
# correct skew
data = inter.rotate(bin_img, best_angle, reshape=False, order=0)
img = im.fromarray((255 * data).astype("uint8")).convert("RGB")
img.save('skew_corrected.png')

3. Удаление шума. Основная цель этапа Удаление шума - сгладить изображение путем удаления мелких точек / пятен, интенсивность которых выше, чем у остальная часть изображения. Удаление шума можно выполнить как для цветных, так и для двоичных изображений.
Один из способов удаления шума с помощью функции OpenCV fastNlMeansDenoisingColored .

import numpy as np 
import cv2 
from matplotlib import pyplot as plt 
# Reading image from folder where it is stored 
img = cv2.imread('bear.png') 
# denoising of image saving it into dst image 
dst = cv2.fastNlMeansDenoisingColored(img, None, 10, 10, 7, 15) 
# Plotting of source and destination image 
plt.subplot(121), plt.imshow(img) 
plt.subplot(122), plt.imshow(dst) 
plt.show()

Подробнее о методах удаления шума и сглаживания изображения можно найти в этой замечательной статье.

4. Прореживание и каркасность: это необязательная задача предварительной обработки, которая зависит от контекста, в котором используется OCR.
→ Если мы используем систему OCR для печатного текста, нет необходимости выполнять эту задачу, потому что печатный текст всегда имеет одинаковую ширину штриха.
→ Если мы используем систему распознавания текста для рукописного текста, эту задачу необходимо выполнить , поскольку разные авторы имеют разный стиль письма и, следовательно, разную ширину штриха. Итак, чтобы сделать ширину штрихов равномерной, мы должны выполнить Thinning and Skeletonization.

Это можно сделать с помощью OpenCV следующим образом

import cv2
import numpy as np
img = cv2.imread('j.png',0)
kernel = np.ones((5,5),np.uint8)
erosion = cv2.erode(img,kernel,iterations = 1)

В приведенном выше коде прореживание изображения зависит от размера ядра и количества итераций.

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

Надеюсь, вы получили представление о том, как Предварительная обработка выполняется в OCR.

Дальнейшее чтение:

В части III мы увидим методы сегментации, используемые системой распознавания текста.

Удачного обучения !!!!

Любые сомнения, предложения и исправления приветствуются. 😃

Использованная литература:

[1] Шафии, М., Сид-Ахмед, М. Обнаружение и исправление перекоса на основе параллельной оси ограничивающей рамки. IJDAR 18, 59–71 (2015). Https://doi.org/10.1007/s10032-014-0230-y

[2] Джотсна, С. Чаухан, Э. Шарма и А. Дугар, «Методы бинаризации для ухудшенных изображений документов - обзор», 5-я Международная конференция по надежности, инфокоммуникационным технологиям и оптимизации (тенденции и будущие направления), 2016 г. ( ICRITO), Нойда, 2016 г., стр. 163–166, DOI: 10.1109 / ICRITO.2016.7784945.

[3] А. Папандреу и Б. Гатос, «Новый метод обнаружения перекоса на основе вертикальных проекций», Международная конференция по анализу и распознаванию документов, 2011 г., Пекин, 2011 г., стр. 384–388, doi : 10.1109 / ICDAR.2011.85.

[4] К. Линь, Т.Х. Ли, С. Лю и Г. Ли, «Реальные фотографии, устраняющие шум с помощью адаптации шумовой области и внимательной генеративной состязательной сети», Конференция IEEE / CVF 2019 года по компьютерному зрению и семинарам по распознаванию образов (CVPRW ), Лонг-Бич, Калифорния, США, 2019 г., стр. 1717–1721, DOI: 10.1109 / CVPRW.2019.00221.

[5] Чоудхари, Амит и Риши, Рахул и Савита, Ахлават. (2013). Новый подход к сегментации символов для автономных рукописных слов. Процедуры информатики. 17. 88–95. 10.1016 / j.procs.2013.05.013.