Как заполнить пробелы в письмах после обнаружения края Canny - PullRequest
0 голосов
/ 26 ноября 2018

Я пытаюсь сделать арабское распознавание текста с помощью Tesseract, но распознавание не работает, если буквы не заполнены черным цветом.Как заполнить пробелы после обнаружения края Кэнни?

Вот пример изображения и пример кода: enter image description here

import tesserocr
from PIL import Image
import pytesseract
import matplotlib as plt
import cv2
import imutils
import numpy as np

image = cv2.imread(r'c:\ahmed\test3.png')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

gray = cv2.bilateralFilter(gray,30,40,40)
#gray = cv2.GaussianBlur(gray,(1,1), 0)
gray =cv2.fastNlMeansDenoising(gray ,None, 4, 7, 21)

image = cv2.adaptiveThreshold(gray,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,
            cv2.THRESH_BINARY,11,2)
k = cv2.getStructuringElement(cv2.MORPH_RECT, (1, 1))

blur = cv2.medianBlur(image,3)
erode = cv2.erode(blur, k)
dilat = cv2.dilate(erode,k)
cv2.imshow("gray", dilat)

#cv2.imshow("dilation", img_dilation)
#thresh = cv2.Canny(thresh, 70, 200)

#crop_img = gray[215:215+315, 783:783+684]
#cv2.imshow("cropped", crop_img)

#resize = imutils.resize(blur, width = 460)
#cv2.imshow("resize", resize)

text = pytesseract.image_to_string(dilat, lang='ara')
print(text)
with open(r"c:\ahmed\file.txt", "w", encoding="utf-8") as myfile:
    myfile.write(text)
cv2.waitKey(0)

Результат: enter image description here

Это примерное изображение , которое не будет работать ни с порогом, ни с Canny.

1 Ответ

0 голосов
/ 27 ноября 2018

В этом случае, поскольку текст черный, лучше всего просто найти все черные пиксели.

Один из очень простых способов сделать это с помощью NumPy заключается в следующем:

import matplotlib.pyplot as pp
import numpy as np

image = pp.imread(r'/home/cris/tmp/Zuv3p.jpg')
bin = np.all(image<100, axis=2)

Что это делает, так это найти все пиксели, где все три канала ниже значения 100. Я выбрал порог 100 в произвольном порядке, возможно, есть лучшие способы выбрать порог.:)


Примечания:

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

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


Редактировать: Если по какой-то причине np.all жалуется на тип данных (это не для меня), вы должны иметь возможностьпреобразовать свой ввод в правильный тип:

bin = np.all(np.array(image<100, dtype=np.bool), axis=2)

или, может быть,

bin = np.all(np.array(image<100, dtype=np.uint8), axis=2)
...