Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用PyteSeract和OpenCV在平面图上显示OCR屏幕截图_Python_Opencv_Ocr_Tesseract_Python Tesseract - Fatal编程技术网

Python 使用PyteSeract和OpenCV在平面图上显示OCR屏幕截图

Python 使用PyteSeract和OpenCV在平面图上显示OCR屏幕截图,python,opencv,ocr,tesseract,python-tesseract,Python,Opencv,Ocr,Tesseract,Python Tesseract,我试图写一个函数,将采取一个房子的平面图jpg,并使用光学字符识别提取的平方英尺,是写在图像的某个地方 import requests from PIL import Image import pytesseract import pandas as pd import numpy as np import cv2 import io def floorplan_ocr(url): """ a row-wise funct

我试图写一个函数,将采取一个房子的平面图jpg,并使用光学字符识别提取的平方英尺,是写在图像的某个地方

    import requests
    from PIL import Image
    import pytesseract
    import pandas as pd
    import numpy as np
    import cv2
    import io

    def floorplan_ocr(url):
    """ a row-wise function to use pytesseract to scrape the word data from the floorplan
    images, requires tesseract 
    to be installed https://github.com/tesseract-ocr/tesseract/wiki"""

    if pd.isna(url):
        return np.nan

    res = ''
    response = requests.get(url, stream=True)
    if response.status_code == 200:
        img = response.raw
        img = np.asarray(bytearray(img.read()), dtype="uint8")
        img = cv2.imdecode(img, cv2.CV_8UC1)
        img = cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,\
            cv2.THRESH_BINARY,11,2)
        #img = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 31, 2)
        res = pytesseract.image_to_string(img, lang='eng', config='--remove-background')
        del response
        del img
    else:
        return np.nan

    #print(res)
    return res

然而,我并没有取得太大的成功。只有大约四分之一的图像实际输出包含平方英尺的文本

e、 g目前
floorplan\u ocr(https://i.imgur.com/9qwozIb.jpg)
输出;apprnxx 135 max\nGArhaPpmxd1m max\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n美国南部阿帕克斯正午523区总面积。a 50。M)\nav.Wzms他“a!M M…M粗心的mmnmrmm mma y“妈妈”;\n'wmduw:reams M wurmmmm mm mm.M nanspmmmy 3 mm:51\nmm“M mmm M M M;wan wmumw-mm my和mm mm as M被任何\nwmw PM“rmwm mm M.pwmwmwmwmwm M M M.mum mum mum mum mum mum mum num.num.\n

floorplan\u ocr(https://i.imgur.com/sjxMpVp.jpg)
输出
'

我认为我面临的一些问题是:

  • 文本可能是灰度的
  • 图像的DPI较低(这是否真的很重要,或者是否会影响总分辨率,似乎存在一些争议)
  • 文本格式不一致
  • 我陷入困境,正在努力提高我的成绩。我想提取的只是“XXX平方英尺”(以及所有可能的书写方式)

    有更好的方法吗


    非常感谢。

    文本周围的所有像素化使Tesseract更难完成其任务。 我用了一个简单的方法使点消失。我没有做任何阈值/二值化。但是我必须缩放图像以获得任何字符识别

    import pytesseract   
    import numpy as np
    import cv2
    
    img = cv2.imread('floor_original.jpg', 0) # read as grayscale
    img = cv2.resize(img, (0,0), fx=2, fy=2)  # scale image 2X
    
    alpha = 1.2
    beta = -20
    img = cv2.addWeighted( img, alpha, img, 0, beta)
    cv2.imwrite('output.png', img)  
    
    res = pytesseract.image_to_string(img, lang='eng', config='--remove-background')
    print(res)
    
    编辑 上面的代码可能有一些平台/版本依赖性。它在我的Linux机器上运行,但在我的Windows机器上不运行。为了让它在Windows上运行,我将最后两行修改为

    res = pytesseract.image_to_string(img, lang='eng', config='remove-background')
    print(res.encode())
    
    tesseract的输出(我添加了粗体以强调平方英尺):

    TT-xs

    大致内部总面积=50.7平方米/546平方英尺

    所有尺寸仅为估算值,可能不是精确的测量计划 可能会改变草图。渲染图matenala,lava, 阿皮克特斯

    ne开发商、管理公司、业主和其他附属公司 所有的人都是独行侠

    jements Arax是近似值

    处理后的图像:


    在裁剪图像的底部四分之一后,通过应用这几行来调整第二张图像的大小并更改对比度/亮度

    img = cv2.imread("download.jpg")
    
    img = cv2.resize(img, (0, 0), fx=2, fy=2)
    
    img = cv2.convertScaleAbs(img, alpha=1.2, beta=-40)
    
    text = pytesseract.image_to_string(img, config='-l eng --oem 1 --psm 3')
    
    我设法得到了这个结果:

    总建筑面积约528平方英尺(49.0平方米)

    尽管已尽一切努力确保地板的准确性 此处包含平面图,尺寸:门、窗、房间和任何 其他项目为近似项目,不承担任何责任 错误、遗漏或错误陈述。此计划用于@ustrative 仅供任何潜在购买者使用。 所示的服务、系统和设备尚未经过测试,也没有 保证a8的可操作性或效率可通过 Metropix©2019

    由于图像结构彼此不同,我没有对图像进行treshold处理,并且由于图像不仅仅是文本,所以OTSU阈值处理无法找到正确的值

    回答所有问题:Tesseract实际上最适合灰度图像(白色背景上的黑色文本)

    关于DPI/分辨率问题,确实存在一些争论,但也存在一些经验事实:DPI值并不重要(因为同一DPI的文本大小可能不同)。要使Tesseract OCR发挥最佳效果,您的字符需要(编辑:)30-33像素(高),小一些像素会使Tesseract几乎毫无用处,而更大的字符实际上会降低准确性,尽管不会显著降低。(编辑:找到源代码->)

    最后,文本格式实际上没有改变(至少在您的示例中是这样)。因此,您这里的主要问题是文本大小,以及您解析整个页面的事实。如果您想要的文本行始终位于图像的底部,只需提取(切片)您的原始图像,因此您只需向Tesseract提供相关数据,这也将使其速度更快

    编辑: 如果您也在搜索从ocr文本中提取平方英尺的方法:

    text = "some place holder text 5471 square feet some more text"
    # store here all the possible way it can be written
    sqft_list = ["sq ft", "square feet", "sqft"]
    extracted_value = ""
    
    for sqft in sqft_list:
        if sqft in text:
            start = text.index(sqft) - 1
            end = start + len(sqft) + 1
            while text[start - 1] != " ":
                start -= 1
            extracted_value = text[start:end]
            break
    
    print(extracted_value)
    
    5471平方英尺


    可能更容易识别墙、比例和单位,只需自己进行计算,不是吗?;)我不知道为什么会有关于低DPI是否重要的争论。这很重要。如果你看看阈值图像的质量,你能从tesseract中获得任何文本是一个奇迹。如果你能得到,建议更高的DPI,最好是无损格式(PNG通常是一个不错的选择)。对于这样的图像,无损压缩通常会提供较小的文件大小。您是否仅尝试提取“近似总内部面积=50.7平方米/546平方英尺”行?@bfris争论似乎是在DPI和分辨率之间,因为DPI只是一个显示指令。即分辨率很重要,但DPI不重要。@是的,这就是行,或者更具体地说,是“546平方英尺”更新代码来编写输出图像。我使用的图像与发布的完全相同。如果您的输出图像与我的不一样,那么我们可能会“我们正在处理另一个源映像。我正在使用tesseract 4.0.0-beta.1。@bfris在tesseract上运行
    config='--remove background'
    吗?对我来说,当我删除前两个破折号
    config='remove-background'
    @singrium时,它会工作,谢谢你的提示。我已经更新了答案。我无法让tesseract在Windows u上运行。”除非我删除了选项上的双破折号。