Python 使用PyteSeract和OpenCV在平面图上显示OCR屏幕截图
我试图写一个函数,将采取一个房子的平面图jpg,并使用光学字符识别提取的平方英尺,是写在图像的某个地方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
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)
输出'
我认为我面临的一些问题是:
非常感谢。文本周围的所有像素化使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上运行。”除非我删除了选项上的双破折号。