2015-12-16 17 views
3

Я пытаюсь сделать распознавание OCR на скриншоте, после снятия скриншота (из области рабочего стола, на которую вы щелкнули), он идет до pibxbuffer, содержимое которого находится в pytesseract. Но после использования качества изображения pixbuffer это плохо: он перекошен (я попытался сохранить его в каталоге, а не pixbuffer, и посмотрел на него).Улучшение OCR изображения без масштабирования (с использованием PIL, pixbuf)?

def takeScreenshot(self, x, y, width = 150, height = 30): 
    self.width=width 
    self.height=height 
    window = Gdk.get_default_root_window() 
    #x, y, width, height = window.get_geometry() 

    #print("The size of the root window is {} x {}".format(width, height)) 

    # get_from_drawable() was deprecated. See: 
    # https://developer.gnome.org/gtk3/stable/ch24s02.html#id-1.6.3.4.7 
    pixbufObj = Gdk.pixbuf_get_from_window(window, x, y, width, height) 
    height = pixbufObj.get_height() 
    width = pixbufObj.get_width() 
    image = Image.frombuffer("RGB", (width, height), 
          pixbufObj.get_pixels(), 'raw', 'RGB', 0, 1) 
    image = image.resize((width*20,height*20), Image.ANTIALIAS) 
    #image.save("saved.png") 
    print(pytesseract.image_to_string(image)) 

    print("takenScreenshot:",x,y) 

Когда я сохранил изображение в каталоге, все было в порядке (качество), и признание было хорошим.
Пробовал без Image.ANTIALIAS - не имеет значения.

(Цель масштабирования по 20: Я попытался код, узнаваемым образом, сохраненный в директории, без масштабирования качества распознавания было плохо.)

The bad picture

ПРОБЛЕМА В ТОМ, ЧТО ИМИДЖЕ перекошен.

+0

Я задавался вопросом, если 'Image.ANTIALIAS' делал разницу. Это не похоже на случай. Если бы я мог сделать хорошее предположение, я бы сказал, что масштабирование изображения 20x, вероятно, позволило расширить границы решений с минимальной потерей точности пикселей. Это означает, что при масштабировании изображения было проще ** Tesseract ** для _tell_ краев символов. – Quirk

+0

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

+0

@ Mailerdaimon вы можете быть более конкретным: как это может быть неправильно, где я сделал это неправильно? –

ответ

2

Такой экстремальный масштабирование, как правило, плохо для распознавания текста, в частности, в полном цвете и со специальной обработкой (антиалиасинга)

я бы:

  • высококлассные меньше (? Нет), или использовать БЛИЖАЙШЕЕ
  • обращенным в оттенках серого сразу же после загрузки (чтобы избежать артефактов, с которыми вы сталкиваетесь):

    image = image.convert('L') 
    
+0

Масштабирование менее чем за 20 не подходит для распознавания. –

+0

груз откуда? проблема распознавания заключается в том, что изображение искажено. –

+0

оттенки серого до изменения размера помогут. Создадим больше связных краев, а не извращенных, где вы сможете увидеть цвета. – whunterknight

2

Я не знаю, если вы все еще ищете решение, но я столкнулся с той же проблемой искажения изображения. Это какая-то дополнительная проблема с GdkPixBuf. В основном, height и width изображения должны быть всегда divisible by 8. Так вот что я делаю, прежде чем снимать скриншот:

width = width + (8 - (width % 8)) 
height = height + (8 - (height % 8)) 

Снимок экрана должен работать после этого.

Вы можете прочитать больше о проблеме here