【发布时间】:2020-05-19 19:20:06
【问题描述】:
【问题讨论】:
标签: python opencv image-processing
【问题讨论】:
标签: python opencv image-processing
我在我的 Gists 存档中找到了一个可能对你有用的 sn-p - 不幸的是,它不是我的代码,我没有它的原始来源,但简而言之,这个概念是使用 CV2 morphological transformations 首先删除水平使用水平内核的线条,然后用较小的垂直内核填充缺失的像素。
您可以尝试使用不同的内核和参数,看看是否可以让它更好地适应您的特定情况。我建议首先删除水平线并检查 Pyteseract 如何处理它,而无需任何额外的后处理。请注意,当我们填充缺失的像素时 - 其他一些文本变得不那么可读了。
import cv2
image = cv2.imread('./dumpster/dVbYd.jpg')
gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]
# Remove lines using horizontal kernal
horizontal_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (25,1))
detected_lines = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, horizontal_kernel, iterations=2)
cnts = cv2.findContours(detected_lines, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
for c in cnts:
cv2.drawContours(image, [c], -1, (255,255,255), 2)
# Repair image using smaller vertical kernel
repair_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 6))
result = 255 - cv2.morphologyEx(255 - image, cv2.MORPH_CLOSE, repair_kernel, iterations=1)
plt.figure(figsize=(15,10))
plt.imshow(gray, cmap='gray')
plt.show()
plt.figure(figsize=(15,10))
plt.imshow(image)
plt.show()
plt.figure(figsize=(15,10))
plt.imshow(result)
plt.show()
【讨论】: