gpt4 book ai didi

python - 使用 tesseract 和 OpenCV 对平面图屏幕截图进行 OCR

转载 作者:行者123 更新时间:2023-12-01 00:33:03 28 4
gpt4 key购买 nike

我正在尝试编写一个函数,该函数将获取房屋平面图的 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

enter image description here

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

例如目前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\n总计 APPaux 中午区域 523,因此,我们。 a 50. M )\nav .Wzms 他 "a! m m... mi 粗心 mmnmrmm mma y“妈妈“;\n' wmduw: 令 m wuhrmmm mm“.m nanspmmmmy 3 mm :51\nmm"m mmm m ; wan wmumw- mm my 和 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) 输出 ' '

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

  1. 文本可能是灰度的
  2. 图像的 DPI 较低(这是否真的很重要或者是否是总分辨率,这似乎存在一些争议)
  3. 文本格式不一致

我陷入困境,正在努力提高我的成绩。我想要提取的是“XXX sq ft”(以及所有可能的书写方式)

有更好的方法吗?

非常感谢。

最佳答案

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

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')

我设法得到这个结果:

TOTAL APPROX. FLOOR AREA 528 SQ.FT. (49.0 SQ.M.)

Whilst every attempt has been made to ensure the accuracy of the floor plan contained here, measurements: of doors, windows, rooms and any other items are approximate and no responsibility ts taken for any error, omission, or mis-statement. This plan is for @ustrative purposes only and should be used as such by any prospective purchaser. The services, systems and appliances shown have not been tested and no guarantee a8 to the operability or efficiency can be given Made with Metropix ©2019

我没有对图像进行阈值处理,因为您的图像结构彼此不同,并且由于图像不仅仅是文本,因此 OTSU 阈值处理找不到正确的值。

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

关于 DPI/分辨率问题,确实存在一些争论,但也有一些经验事实:DPI 值并不重要(因为相同 DPI 的文本大小可能会有所不同)。为了使 Tesseract OCR 发挥最佳效果,您的字符需要(已编辑:)30-33 像素(高度),小几个像素可能会使 Tesseract 几乎毫无用处,而较大的字符实际上会降低准确性,尽管并不显着。 (编辑:找到来源->https://groups.google.com/forum/#!msg/tesseract-ocr/Wdh_JJwnw94/24JHDYQbBQAJ)

最后,文本格式并没有真正改变(至少在你的例子中)。所以这里的主要问题是文本大小,以及解析整个页面的事实。如果您想要的文本行始终位于图像的底部,只需提取(切片)原始图像,这样您只需向 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 square feet

关于python - 使用 tesseract 和 OpenCV 对平面图屏幕截图进行 OCR,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58030833/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com