gpt4 book ai didi

image - 如何在以编程方式保留文本的同时删除图像中的所有线条和边框?

转载 作者:太空宇宙 更新时间:2023-11-03 20:39:17 24 4
gpt4 key购买 nike

我正在尝试使用 Tesseract OCR 从图像中提取文本。目前,对于这个原始输入图像,输出质量非常差(大约 50%)。但是当我尝试使用 photoshop 删除所有线条和边框时,输出效果提高了很多 (~90%)。有什么方法可以使用 OpenCV、Imagemagick 或其他技术以编程方式删除图像中的所有线条和边框(保留文本)?

原始图片: Original Image

预期图像: Expect Image

最佳答案

由于没有人发布完整的 OpenCV 解决方案,这里提供一个简单的方法

  1. 获取二进制图像。 Load the image , 转换为 grayscale , 和 Otsu's threshold

  2. 删除水平线。我们创建一个 horizontal shaped kernelcv2.getStructuringElement()然后 find contours并删除带有 cv2.drawContours() 的行

  3. 删除垂直线。我们执行相同的操作,但使用垂直形状的内核


加载图像,转换为灰度,然后 Otsu's threshold获取二值图像

image = cv2.imread('1.png')
result = image.copy()
gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]

enter image description here

现在我们创建一个水平内核来检测水平线 cv2.getStructuringElement()并使用 cv2.findContours() 找到轮廓.要删除水平线,我们使用cv2.drawContours()并用白色填充每个水平轮廓。这有效地“删除”了水平线。这是检测到的绿色水平线

# Remove horizontal lines
horizontal_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (40,1))
remove_horizontal = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, horizontal_kernel, iterations=2)
cnts = cv2.findContours(remove_horizontal, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
for c in cnts:
cv2.drawContours(result, [c], -1, (255,255,255), 5)

enter image description here

类似地,我们创建一个垂直内核来移除垂直线,找到轮廓,并用白色填充每个垂直轮廓。这是检测到的以绿色突出显示的垂直线

# Remove vertical lines
vertical_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (1,40))
remove_vertical = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, vertical_kernel, iterations=2)
cnts = cv2.findContours(remove_vertical, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
for c in cnts:
cv2.drawContours(result, [c], -1, (255,255,255), 5)

enter image description here

用白色填充水平和垂直线后,这是我们的结果

enter image description here


注意:根据图像,您可能需要修改内核大小。例如,要捕获更长的水平线,可能需要将水平内核从 (40, 1) 增加到 (80, 1)。如果你想检测更粗的水平线,那么你可以增加内核的宽度来表示 (80, 2)。此外,您可以在执行 cv2.morphologyEx() 时增加迭代次数。同样,您可以修改垂直内核以检测更多或更少的垂直线。增加或减少内核大小时需要权衡取舍,因为您可能会捕获更多或更少的行。同样,这一切都取决于输入图像

完整性的完整代码

import cv2

image = cv2.imread('1.png')
result = image.copy()
gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]

# Remove horizontal lines
horizontal_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (40,1))
remove_horizontal = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, horizontal_kernel, iterations=2)
cnts = cv2.findContours(remove_horizontal, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
for c in cnts:
cv2.drawContours(result, [c], -1, (255,255,255), 5)

# Remove vertical lines
vertical_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (1,40))
remove_vertical = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, vertical_kernel, iterations=2)
cnts = cv2.findContours(remove_vertical, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
for c in cnts:
cv2.drawContours(result, [c], -1, (255,255,255), 5)

cv2.imshow('thresh', thresh)
cv2.imshow('result', result)
cv2.imwrite('result.png', result)
cv2.waitKey()

关于image - 如何在以编程方式保留文本的同时删除图像中的所有线条和边框?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33949831/

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