【问题标题】:Improve OCR of image without scaling (using PIL, pixbuf)?在不缩放的情况下改进图像的 OCR(使用 PIL、pixbuf)?
【发布时间】:2015-12-16 19:54:05
【问题描述】:

我正在尝试在屏幕截图上进行 OCR 识别,在(桌面区域,您单击的区域)拍摄屏幕截图后,它会转到 pibxbuffer,其中的内容会转到 pytesseract。 但是使用pixbuffer后画质不好:歪了(我试着把它保存在一个目录中,而不是pixbuffer,看了看)。

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

问题是图像偏斜。

【问题讨论】:

  • 我想知道Image.ANTIALIAS 是否有所作为。情况似乎并非如此。如果我猜得好,我会告诉你,将图像缩放 20 倍可能会为决策边界提供更大的范围,同时像素精度的损失最小。这意味着当您缩放图像时,Tesseract 更容易告诉字符的边缘。
  • 看起来您的图像宽度不对,这就是您的图像看起来歪斜的原因。仔细检查您的图片尺寸!
  • @Mailerdaimon 你能说得更具体一点吗:怎么会出错,我哪里做错了?
  • @GeorgeJ 如果您的宽度,比如说,2 像素太大,则每一行属于下一行的两个像素将显示在当前行中。这会使图像看起来歪斜。左侧的黑色对角线看起来像是该问题的另一个提示。问题出在哪里,需要进行一些调试并打印出图像的宽度和高度,并不断检查图像的显示方式。

标签: python python-3.x python-imaging-library gdkpixbuf pixbuf


【解决方案1】:

这种极端的缩放通常对 OCR 不利,尤其是在全彩色和特殊处理(抗锯齿)的情况下

我愿意:

  • 不高档(没有?),或使用 NEAREST
  • 加载后立即转换为灰度(以避免您看到的伪影):

    image = image.convert('L')
    

【讨论】:

  • 从哪里加载?识别的问题是图像倾斜。
  • 调整大小之前的灰度会有所帮助。将创建更具凝聚力的边缘,而不是您可以看到颜色的扭曲边缘。
  • 感谢您的建议(这并不能解决主要问题)
  • 倾斜量是否一致?如果是这样,请查看 PIL 的 AFFINE 变换:stackoverflow.com/questions/14177744/…
【解决方案2】:

我不知道您是否仍在寻找解决方案,但我遇到了图像歪斜的相同问题。这是GdkPixBuf 的某种填充问题。基本上,图像的heightwidth 应始终为divisible by 8。所以这就是我在截屏之前所做的:

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

执行此操作后,屏幕截图应该可以工作。

您可以阅读有关该问题的更多信息here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-29
    • 1970-01-01
    • 2016-03-22
    • 1970-01-01
    • 2018-08-12
    • 2010-10-06
    相关资源
    最近更新 更多