【发布时间】:2021-04-14 02:13:27
【问题描述】:
我有许多蓝图,我想检测蓝图上的数字,以便将它们变成合适的模型。 例如,我有以下图片,并且想要这张图片上的所有数字,所以我运行了以下代码:
import pytesseract
from pytesseract import Output
import cv2
import numpy as np
img = cv2.imread('vdb7C.jpg')
custom_config = r' (--oem 2 --psm 10'
d = pytesseract.image_to_data(img,config=custom_config,lang='eng', output_type=Output.DICT)
n_boxes = len(d['level'])
for i in range(n_boxes):
text=d["text"][i]
print(text+ str(str.isdigit(text)))
if str.isdigit(text):
(x, y, w, h) = (d['left'][i], d['top'][i], d['width'][i], d['height'][i])
cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2)
cv2.imwrite("output.jpg" , img)
这给了我以下结果:。正如您所看到的,它确实正确识别了蓝图上的一些数字,但是它错过了很多其他数字并错误地检测到了一些实际上并不存在的数字。我更关心获得所有数字而不是一些误报,但仍希望将这些数字保持在最低限度,所以有什么建议吗?
我已经尝试过细化操作、重新缩放图像、旋转图像和平滑图像,但所有这些似乎都没有太大区别,极端重新缩放(*0.1 或 *10)确实改变了一些事情但是在图像的某一部分取得的任何进步都会被其他部分出现的错误所抵消。
特别困难的情况是在左侧建筑物中,我们的行号接近甚至重叠设计的一部分。
在这里,我们看到 2 个此类情况的示例
还要注意图片之间的字体使用不一致。
值得注意的是,线条几乎总是明显比用于数字的线条更细,所以也许可以用它来做点什么?
我也尝试过使用 EAST OCR 系统,代码如下: img = cv2.imread('vdb7C.jpg')
W=5664
H=4000
dim = (W, H)
img = cv2.resize(img, dim, interpolation = cv2.INTER_AREA)
net = cv2.dnn.readNet("frozen_east_text_detection.pb")
blob = cv2.dnn.blobFromImage(img, 1.0, (W, H),
(123.68, 116.78, 103.94), swapRB=True, crop=False)
net.setInput(blob)
(scores, geometry) = net.forward(["feature_fusion/Conv_7/Sigmoid",
"feature_fusion/concat_3"])
(numRows, numCols) = scores.shape[2:4]
rects = []
confidences = []
# loop over the number of rows
for y in range(0, numRows):
# extract the scores (probabilities), followed by the geometrical
# data used to derive potential bounding box coordinates that
# surround text
scoresData = scores[0, 0, y]
xData0 = geometry[0, 0, y]
xData1 = geometry[0, 1, y]
xData2 = geometry[0, 2, y]
xData3 = geometry[0, 3, y]
anglesData = geometry[0, 4, y]
for x in range(0, numCols):
if scoresData[x] < confidence:
continue
(offsetX, offsetY) = (x * 4.0, y * 4.0)
angle = anglesData[x]
cos = np.cos(angle)
sin = np.sin(angle)
h = xData0[x] + xData2[x]
w = xData1[x] + xData3[x]
endX = int(offsetX + (cos * xData1[x]) + (sin * xData2[x]))
endY = int(offsetY - (sin * xData1[x]) + (cos * xData2[x]))
startX = int(endX - w)
startY = int(endY - h)
rects.append((startX, startY, endX, endY))
confidences.append(scoresData[x])
boxes = non_max_suppression(np.array(rects), probs=confidences)
for box in boxes:
(y,h,x,w) = box
print(box)
print(np.shape(img))
cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2)
cv2.imwrite("output.jpg" , img)
但是这会导致相当多的边界框位于图像之外,并且通常边界框似乎与内容无关,所以有人知道那里是什么吗? 有什么建议?我现在有 8000 张图片,最终总共需要处理大约 400k 张图片。
【问题讨论】:
-
欢迎任何建议(即使只是批评我的代码风格),如果您有任何问题,请发表评论,以便我改进问题。
-
有趣的项目。我认为 yxour 的代码有点短,无法正确检测到东西。查看其中一些教程pyimagesearch.com/category/optical-character-recognition-ocr
-
@user3732793 感谢您的链接,我将查看这些建议
-
@MadMike 不幸的是,在大多数情况下,数据不以 .png 形式存在,大部分数据是 .jpg,我认为这是不可逆的。
-
删除大于数字的高或宽的行
标签: python python-3.x machine-learning computer-vision ocr