如何利用图像预处理提高OCR的准确性?

重磅干货,第一时间送达

OCR代表光学字符识别,将文档照片或场景照片转换为机器编码的文本。有很多工具可以在你们的系统中实现OCR,例如Tesseract OCR和Cloud Vision。他们使用AI和机器学习以及经过训练的自定义模型。文本识别取决于多种因素,以产生高质量的输出。OCR输出在很大程度上取决于输入图像的质量,这就是每个OCR引擎都提供有关输入图像质量及其大小的准则的原因,这些准则可帮助OCR引擎产生准确的结果。

图像预处理功能可以提高输入图像的质量,以便OCR引擎为我们提供准确的输出,使用以下图像处理操作可以改善输入图像的质量。

图像缩放

图像缩放比例对于图像分析很重要。通常,OCR引擎会准确输出300 DPI的图像。DPI描述了图像的分辨率,换句话说,它表示每英寸的打印点数。

def set_image_dpi(file_path): im = Image.open(file_path) length_x, width_y = im.size factor = min(1, float(1024.0 / length_x)) size = int(factor * length_x), int(factor * width_y) im_resized = im.resize(size, Image.ANTIALIAS) temp_file = tempfile.NamedTemporaryFile(delete=False, suffix='.png') temp_filename = temp_file.name im_resized.save(temp_filename, dpi=(300, 300))    return temp_filenam
偏斜矫正

歪斜图像定义为不直的文档图像。歪斜的图像会直接影响OCR引擎的行分割,从而降低其准确性。我们需要执行以下步骤来更正文本倾斜。

  1. 1.检测图像中歪斜的文本块

  2. gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)gray = cv2.GaussianBlur(gray, (5, 5), 0)edged = cv2.Canny(gray, 10, 50)cnts = cv2.findContours(edged.copy(), cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)cnts = cnts[0] if imutils.is_cv2() else cnts[1]cnts = sorted(cnts, key=cv2.contourArea, reverse=True)[:5]screenCnt = Nonefor c in cnts: peri = cv2.arcLength(c, True) approx = cv2.approxPolyDP(c, 0.02 * peri, True) if len(approx) == 4: screenCnt = approx break
    cv2.drawContours(image, [screenCnt], -1, (0, 255, 0), 2)
  3. 2.计算旋转角度

  4. 3.旋转图像以校正歪斜

pts = np.array(screenCnt.reshape(4, 2) * ratio)warped = four_point_transform(orig, pts)def order_points(pts): # initialzie a list of coordinates that will be ordered # such that the first entry in the list is the top-left, # the second entry is the top-right, the third is the # bottom-right, and the fourth is the bottom-left rect = np.zeros((4, 2), dtype="float32")
# the top-left point will have the smallest sum, whereas # the bottom-right point will have the largest sum s = pts.sum(axis=1) rect[0] = pts[np.argmin(s)] rect[2] = pts[np.argmax(s)]
# now, compute the difference between the points, the # top-right point will have the smallest difference, # whereas the bottom-left will have the largest difference diff = np.diff(pts, axis=1) rect[1] = pts[np.argmin(diff)] rect[3] = pts[np.argmax(diff)]
# return the ordered coordinates return rect

def four_point_transform(image, pts): # obtain a consistent order of the points and unpack them # individually rect = order_points(pts) (tl, tr, br, bl) = rect
# compute the width of the new image, which will be the # maximum distance between bottom-right and bottom-left # x-coordiates or the top-right and top-left x-coordinates widthA = np.sqrt(((br[0] - bl[0]) ** 2) + ((br[1] - bl[1]) ** 2)) widthB = np.sqrt(((tr[0] - tl[0]) ** 2) + ((tr[1] - tl[1]) ** 2)) maxWidth = max(int(widthA), int(widthB))
# compute the height of the new image, which will be the # maximum distance between the top-right and bottom-right # y-coordinates or the top-left and bottom-left y-coordinates heightA = np.sqrt(((tr[0] - br[0]) ** 2) + ((tr[1] - br[1]) ** 2)) heightB = np.sqrt(((tl[0] - bl[0]) ** 2) + ((tl[1] - bl[1]) ** 2)) maxHeight = max(int(heightA), int(heightB))
# now that we have the dimensions of the new image, construct # the set of destination points to obtain a "birds eye view", # (i.e. top-down view) of the image, again specifying points # in the top-left, top-right, bottom-right, and bottom-left # order dst = np.array([ [0, 0], [maxWidth - 1, 0], [maxWidth - 1, maxHeight - 1], [0, maxHeight - 1]], dtype="float32")
# compute the perspective transform matrix and then apply it M = cv2.getPerspectiveTransform(rect, dst) warped = cv2.warpPerspective(image, M, (maxWidth, maxHeight))    return warped
二值化

通常,OCR引擎会在内部进行二值化处理,因为它们可以处理黑白图像。最简单的方法是计算阈值,然后将所有像素转换为白色,且其值高于阈值,其余像素转换为黑色。

除噪或降噪

噪点是图像像素之间颜色或亮度的随机变化。噪声会降低图像中文本的可读性。噪声有两种主要类型:盐椒噪声和高斯噪声。

def remove_noise_and_smooth(file_name): img = cv2.imread(file_name, 0) filtered = cv2.adaptiveThreshold(img.astype(np.uint8), 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 9, 41) kernel = np.ones((1, 1), np.uint8) opening = cv2.morphologyEx(filtered, cv2.MORPH_OPEN, kernel) closing = cv2.morphologyEx(opening, cv2.MORPH_CLOSE, kernel) img = image_smoothening(img) or_image = cv2.bitwise_or(img, closing) return or_image
下载1:OpenCV-Contrib扩展模块中文版教程
(0)

相关推荐

  • (9条消息) ocr图像预处理

    说明:文字方向校正(fft方式和放射变换方式)参考了网上的代码,只做了少量修改 只针对医疗影像图像,自然场景下的另说 因为处理的图像都很大很大,居然有11000*12000这种分辨率的,有90M大小, ...

  • 弹幕君,别挡着我看小姐姐!

    某天代码写得老眼昏花,去B站上摸鱼,突然发现奇怪的现象: 哟呵,B站竟然做了视频前景提取,把弹幕藏到画面人物的后面.识别效果还意外地不错呢. 然后又翻了下,发现这是个叫做"智能防挡弹幕&qu ...

  • MaskRCNN 基于OpenCV DNN的目标检测与实例分割

    原文:MaskRCNN 基于OpenCV DNN的目标检测与实例分割 - AIUAI 这里主要记录基于 OpenCV 4.x DNN 模块和 TensorFlow MaskRCNN 开源模型的目标检测 ...

  • 观点 | Nat. Rev. Immunol.: 我们能否利用微生物群落来提高癌症免疫治疗的效果?

    编译:Mushroom,编辑:小菌菌.江舜尧. 原创微文,欢迎转发转载. 导读 目前,人们将目光聚焦于微生物群落在癌症环境下形成免疫反应的过程.许多有关小鼠和人类的研究表明,特定的微生物共生物种与癌症 ...

  • 企业如何利用税收优惠政策提高企业利润

    企业如何利用税收优惠政策提高企业利润 小企业追求生存,生存才是小企业的难题,而中大型企业追求的发展企业利润,而利润是每个企业得终极目标,但是企业光有盈利是不够的,很多企业老板会发现企业就算盈利了,企业 ...

  • 『艾滋病』美利用免疫促进剂提高艾滋病治疗效果

    据美联社消息,在传统的艾滋病鸡尾酒疗法中添加一种免疫促进剂,可帮助病人更好地控制艾滋病病情. 美国加利福尼亚大学洛杉矶分校艾滋病研究和教育中心主任光安在本月25日发表的一份报告中说,这种免疫促进剂名为 ...

  • 如何合理的利用城市夜游提高形象及发展

    商业区是城市重要的一部分,也是城市夜景的重要组成部分,因此商业区需要合理的利用起来,一些商业区是城市的中心商业区,是以办公楼为中心的重要区域.他们集中在商业.贸易.特色建筑等等,这些建筑外观独特,辅助 ...

  • 初一数学华东师大版利用旋转作图提高班

    初一数学华东师大版利用旋转作图提高班

  • 工程项目如何利用项目管理软件提高项目管理效率的?

    项目管理软件可以让管理者将日常的工作细节与更宏观的整体目标联系起来,管理者通过项目管理工具给成员分配任务,项目成员通过待办事项了解自己的任务,甘特图让团队对项目具有全局的视野,为团队带来更高的效率. ...

  • 如何利用象棋软件提高象棋水平

    如何利用象棋软件提高象棋水平 如今象棋软件人工智能高度发展,其水平在高端机器上已经超越了特级大师水平. 合理利用好这一利器,他将是你学习象棋和快速稳定提高棋艺的绝佳工具,让你事半功倍. 象棋软件的用途 ...

  • 如何利用羊群效应提高交易胜算?

    在投资词汇中,"羊群效应"是指交易者盲目追随既定的投资趋势或模式.这类交易者通常是众所周知的投资理念--"趋势是你的朋友"的信徒.在外汇交易中,这一原则有可能比 ...