【发布时间】:2020-03-28 06:23:39
【问题描述】:
我一直在尝试为 OCR 清除图像:(线条)
有时我需要删除这些行以进一步处理图像,我已经非常接近了,但很多时候阈值从文本中带走了太多:
copy = img.copy()
blur = cv2.GaussianBlur(copy, (9,9), 0)
thresh = cv2.adaptiveThreshold(blur,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV,11,30)
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (9,9))
dilate = cv2.dilate(thresh, kernel, iterations=2)
cnts = cv2.findContours(dilate, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
for c in cnts:
area = cv2.contourArea(c)
if area > 300:
x,y,w,h = cv2.boundingRect(c)
cv2.rectangle(copy, (x, y), (x + w, y + h), (36,255,12), 3)
编辑:此外,如果字体更改,使用常量将不起作用。 有没有通用的方法来做到这一点?
【问题讨论】:
-
其中一些行或其中的片段具有与合法文本相同的特征,并且很难在不破坏有效文本的情况下摆脱它们。如果这适用,您可能会关注它们比字符更长并且有些孤立的事实。所以第一步可能是估计字符的大小和接近度。
-
@YvesDaoust 如何找到字符的接近性? (因为纯粹根据大小进行过滤经常会与字符混淆)
-
您可以找到每个 blob 到其最近邻居的距离。然后通过对距离的直方图分析,您会发现“接近”和“分开”(类似于分布模式)或“包围”和“孤立”之间的阈值。
-
如果多条小线彼此靠近,它们最近的邻居不是另一条小线吗?计算到所有其他 blob 的平均距离会不会太昂贵?
-
“他们最近的邻居不会是另一条小线吗?”:好的反对,法官大人。事实上,一堆紧密的短句段与合法文本没有区别,尽管排列方式完全不可能。您可能必须重新组合虚线的片段。我不确定到所有人的平均距离是否能救你。
标签: python opencv image-processing ocr image-segmentation