我正在尝试对其中具有手写签名的扫描文档进行OCR。请参见下图。
我的问题很简单,有没有办法在忽略签名的情况下仍使用OCR提取人员姓名?当我运行Tesseract OCR时,无法检索名称。我尝试使用下面的代码进行灰度/模糊/阈值处理,但是没有运气。有什么建议吗?
image = cv2.imread(file_path)
image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
image = cv2.GaussianBlur(image, (5, 5), 0)
image = cv2.threshold(image, 0, 255, cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)[1]
答案 0 :(得分:5)
您可以使用scikit-image
的高斯滤镜先模糊细线(使用适当的sigma
),然后再对图像进行二值化(例如,使用某些thresholding
函数),然后再使用通过形态学运算(例如remove_small_objects
或opening
以及适当的structure
),主要去除特征码,然后尝试使用滑动窗口对数字进行分类(假设已经对数字进行了训练)一些模糊的字符,如测试图像中所示)。下面显示了一个示例。
from skimage.morphology import binary_opening, square
from skimage.filters import threshold_minimum
from skimage.io import imread
from skimage.color import rgb2gray
from skimage.filters import gaussian
im = gaussian(rgb2gray(imread('lettersig.jpg')), sigma=2)
thresh = threshold_minimum(im)
im = im > thresh
im = im.astype(np.bool)
plt.figure(figsize=(20,20))
im1 = binary_opening(im, square(3))
plt.imshow(im1)
plt.axis('off')
plt.show()
[EDIT]:使用深度学习模型
另一种选择是将该问题提出为一个对象检测问题,其中字母是对象。我们可以使用深度学习:CNN / RNN /快速RNN模型(带有tensorflow / keras)用于对象检测,或者使用 Yolo 模型(请参阅此article yolo模型进行汽车检测)。
答案 1 :(得分:1)
我想输入的图片是灰度的,否则不同颜色的墨水可能具有独特的力量。
这里的问题是,您的训练集-我猜想-几乎只包含“正常”字母,而没有签名的干扰-因此分类器自然不会在带有签名墨水的字母上工作。一种可行的方法是用这种类型的字母扩展训练集。当然,将这些字母一个接一个地提取和标记是一项艰巨的工作。
您可以使用带有不同签名的真实字母,但是也可以人为生成相似的字母。您只需要在其上方移动具有不同签名段的不同字母即可。此过程可能是自动化的。
答案 2 :(得分:1)
您可以尝试使用形态学操作对图像进行预处理。
您可以尝试opening去除签名的细线。问题在于它也可能删除标点符号。
image = cv2.imread(file_path)
image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
kernel = cv2.getStructuringElement(cv2.MORPH_CROSS,(5,5))
image = cv2.morphologyEx(image, cv2.MORPH_OPEN, kernel)
您可能必须更改内核大小或形状。只需尝试不同的设置即可。
答案 3 :(得分:0)
您可以尝试其他OCR提供程序执行同一任务。例如,https://cloud.google.com/vision/试试这个。您可以上传图片并免费检查。
您将从API获得响应,从中可以提取所需的文本。在同一网页上也提供了提取该文本的文档。
检查一下。这将帮助您获取该文本。当我遇到相同的问题时,这是我自己的答案。 Convert Google Vision API response to JSON