спасибо за отзыв, просто думал, что выложу свое решение, которое у меня теперь отлично работает!
Две вещи, которые я узнал об оптическом распознавании символов:
- работает значительно лучшекогда текст черный, фон белый.
- работает лучше с большим количеством пробелов между символами
- параметр конфигурации psm может улучшить качество.
Вотмой код:
#timestamp section
def grabStamp(image):
#load image and invert black & whites
image = cv2.cvtColor(cv2.imread(image), cv2.COLOR_BGR2GRAY)
im = np.invert(image)
#exxtract the time stamp section
timeStamp = image[:15,:112]
#add a boarder & create only binary colors (0,255)
constant= cv2.copyMakeBorder(timeStamp,10,10,10,10,cv2.BORDER_CONSTANT,value=0)
_, contrasted = cv2.threshold(constant,127,255,cv2.THRESH_BINARY)
#loop to find colons
for x in range(0,113):
if is_slice_in_list(semiColon, np.ndarray.tolist(contrasted[:,x])) == True:
if np.where(contrasted[:,x]==255)[0][0] == 17:
#converting back to black pixils
contrasted[:,x][ contrasted[:,x] == 255] = 0
#loop to find slashes
for x in range(0,113):
if is_slice_in_list(slash, np.ndarray.tolist(contrasted[:,x])) == True:
if np.where(contrasted[:,x]==255)[0][0] == 17:
if is_slice_in_list(slash_, np.ndarray.tolist(contrasted[:,x - 1])) == True:
contrasted[:,x][ contrasted[:,x] == 255] = 0
contrasted[:,x-1][ contrasted[:,x-1] == 255] = 0
contrasted[:,x+1][ contrasted[:,x+1] == 255] = 0
#invert back
im = np.invert(contrasted)
return pytesseract.image_to_string(im,config= '--psm 7')
Вот процесс, запущенный с изменениями для повышения точности:
grabStamp(image)
Out[250]: '22022018 1157 38'
вот процесс без каких-либо настроек (только инвертирование цветов):
pytesseract.image_to_string(timeStamp,config= '--psm 7')
Out[254]: 'Prlivd7ihl Rete 3'
Исходное изображение:
Измененное изображение: