【发布时间】:2020-01-21 15:47:36
【问题描述】:
我正在尝试编写一个函数,该函数将获取房屋平面图的 jpg 并使用 OCR 提取写在图像上某处的平方英尺
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
但是我并没有取得太大的成功。只有大约四分之一的图像实际输出包含平方英尺的文本。
例如目前
floorplan_ocr(https://i.imgur.com/9qwozIb.jpg) 输出 'K\'Fréfiéfimmimmuuéé\n2|; apprnxx 135 max\nGArhaPpmxd1m max\n\n \n\n \n\n \n\n \n\n \n\n \n\n \n\nTOTAL APPaux noon AREA 523 so Fr, us. a 50. M )\nav .Wzms him "a! m m... mi unwary mmnmrmm mma y“ mum“;\n‘ wmduw: reams m wuhrmmm mm“ .m nanspmmmmy 3 mm :51\nmm" m mmm m; wan wmumw- mm my and mm mm as m by any\nwfmw PM” rmwm mm m .pwmwm m. mum mud ms nu mum.\n(.5 n: ma undammmw an we Ewen\nM vagw‘m Mewpkeem' (并且需要很长时间)
floorplan_ocr(https://i.imgur.com/sjxMpVp.jpg) 输出' '。
我认为我面临的一些问题是:
- 文本可能是灰度的
- 图像的 DPI 较低(这是否真的很重要或总分辨率似乎存在争议)
- 文本格式不一致
我陷入困境,正在努力提高我的成绩。我只想提取“XXX sq ft”(以及所有可能的写法)
有没有更好的方法来做到这一点?
非常感谢。
【问题讨论】:
-
可能更容易识别墙壁、比例和单位,然后自己进行计算,不是吗? ;)
-
我不知道为什么会有关于低 DPI 是否重要的争论。这很很重要。如果您查看阈值图像的质量,那么您从 tesseract 中获得任何文本都是一个奇迹。如果可以的话,推荐更高的 DPI,最好是无损格式(PNG 通常是一个不错的选择)。对于这样的图像,无损压缩通常仍会产生较小的文件大小。
-
您是否只想提取“近似总内部面积 = 50.7 平方米 / 546 平方英尺”这一行?
-
@bfris 争论似乎在 DPI 和分辨率之间,因为 DPI 只是一个显示指令。即分辨率很重要,但 DPI 不重要。
-
@nathancy 是的,就是这条线,或者更具体地说是“546 平方英尺”
标签: python opencv ocr tesseract python-tesseract