如何处理二值图像以对齐一行中的稀疏字母?
How to process a binary image to align sparse letters in a row?
我正在尝试使用 tesseract ocr 将图像转换为文本。图像总是有三个字母没有 rotation/skew,但随机分布在 90x50 png 文件中。
仅通过清理并转换为black/white,tesseract无法获取图像中的文字。在 Paint 中手动对齐它们后,ocr 会给出精确匹配。我什至不需要完全对齐。
我想要的是关于如何在将图像发送到 tesseract 之前自动对齐图像中的字符的一些提示。
我正在将 python 与 tesseract 和 opencv 一起使用。
原图:
我做了什么-黑白分明:
我想做的 - 按代码对齐:
您可以使用以下代码来实现此输出。一些常量可能需要更改以满足您的需要:
import cv2
import numpy as np
# Read the image (resize so it is easier to see)
img = cv2.imread("/home/stephen/Desktop/letters.png",0)
h,w = img.shape
img = cv2.resize(img, (w*5,h*5))
# Threshold the image and find the contours
_, thresh = cv2.threshold(img, 123, 255, cv2.THRESH_BINARY_INV);
contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
# Create a white background iamge to paste the letters on
bg = np.zeros((200,200), np.uint8)
bg[:] = 255
left = 5
# Iterate through the contours
for contour,h in zip(contours, hierarchy[0]):
# Ignore inside parts (circle in a 'p' or 'b')
if h[3] == -1:
# Get the bounding rectangle
x,y,w,h = cv2.boundingRect(contour)
# Paste it onto the background
bg[5:5+h,left:left+w] = img[y:y+h,x:x+w]
left += (w + 5)
cv2.imshow('thresh', bg)
cv2.waitKey()
我正在尝试使用 tesseract ocr 将图像转换为文本。图像总是有三个字母没有 rotation/skew,但随机分布在 90x50 png 文件中。
仅通过清理并转换为black/white,tesseract无法获取图像中的文字。在 Paint 中手动对齐它们后,ocr 会给出精确匹配。我什至不需要完全对齐。 我想要的是关于如何在将图像发送到 tesseract 之前自动对齐图像中的字符的一些提示。
我正在将 python 与 tesseract 和 opencv 一起使用。
原图:
我做了什么-黑白分明:
我想做的 - 按代码对齐:
您可以使用以下代码来实现此输出。一些常量可能需要更改以满足您的需要:
import cv2
import numpy as np
# Read the image (resize so it is easier to see)
img = cv2.imread("/home/stephen/Desktop/letters.png",0)
h,w = img.shape
img = cv2.resize(img, (w*5,h*5))
# Threshold the image and find the contours
_, thresh = cv2.threshold(img, 123, 255, cv2.THRESH_BINARY_INV);
contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
# Create a white background iamge to paste the letters on
bg = np.zeros((200,200), np.uint8)
bg[:] = 255
left = 5
# Iterate through the contours
for contour,h in zip(contours, hierarchy[0]):
# Ignore inside parts (circle in a 'p' or 'b')
if h[3] == -1:
# Get the bounding rectangle
x,y,w,h = cv2.boundingRect(contour)
# Paste it onto the background
bg[5:5+h,left:left+w] = img[y:y+h,x:x+w]
left += (w + 5)
cv2.imshow('thresh', bg)
cv2.waitKey()