【问题标题】:extract data from the overlapping letters in a image从图像中的重叠字母中提取数据
【发布时间】:2020-04-04 14:24:23
【问题描述】:

输入图片:

我想从图像中提取数据 (ocr) 我试过的代码:

    import cv2
    import textract
    import numpy as np
    img = cv2.imread('/home/ajay/Desktop/name.jpg',0)
    # img = cv2.imread('path_to_your_image', 0)
    _, blackAndWhite = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY_INV)
    nlabels, labels, stats, centroids = cv2.connectedComponentsWithStats(blackAndWhite, None, None, None, 8, cv2.CV_32S)
    sizes = stats[1:, -1] #get CC_STAT_AREA component
    img2 = np.zeros((labels.shape), np.uint8)
    for i in range(0, nlabels - 1):
        if sizes[i] >= 50:   #filter small dotted regions
            img2[labels == i + 1] = 255
    res = cv2.bitwise_not(img2)
    cv2.imwrite('ress.png', res)
    a =  textract.process('ress.png',method = 'tesseract')
    a = a.decode()
    print(a)

【问题讨论】:

  • 我不确定你所说的 noise 是什么。我在这张二进制图片中看到的很少。你能向我们展示预期的“干净”图像吗?
  • 添加预期输出请检查一次
  • 我同意@YvesDaoust,您的二值化图像中基本上没有噪点。你在找什么?
  • 我可以想象如何从预期的输出图像中获取您的输入图像,但我认为您不能以非常简单的方式反过来。
  • 您的“预期输出”似乎是原始版本的模糊版本(二值化之前)。以什么方式更干净?它似乎并不比第一个更具可读性。

标签: python numpy opencv image-processing python-imaging-library


【解决方案1】:

一个简单的方法是:

  1. 应用锐化内核
  2. 大津的门槛
  3. 应用轻微的高斯模糊
  4. 反转图像
  5. OCR

以下是步骤的可视化:

输入图像

锐化

大津的门槛

轻微的高斯模糊

反转图像

这是使用 Pytesseract 的 OCR 结果

DST INTERNATIONAL D-307@ 3266 01 Dec 2007. HowellJerde Jan!
2007" 125802AM RafaelaBoyer Keon3@gmnil.com Fhvio Abernathy Sr.

代码

import cv2
import numpy as np
import pytesseract

pytesseract.pytesseract.tesseract_cmd = r"C:\Program Files\Tesseract-OCR\tesseract.exe"

image = cv2.imread('1.jpg')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
kernel = np.array([[-1,-1,-1], [-1,9,-1], [-1,-1,-1]])
sharpen = cv2.filter2D(gray, -1, kernel)

thresh = cv2.threshold(sharpen, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]

blur = cv2.GaussianBlur(thresh, (3,3), 0)
invert = 255 - blur
data = pytesseract.image_to_string(invert, lang='eng',config='--psm 6')
print(data)

cv2.imshow('sharpen', sharpen)
cv2.imshow('thresh', thresh)
cv2.imshow('blur', blur)
cv2.imshow('invert', invert)
cv2.waitKey()

【讨论】:

  • 我们可以把图片中的文字做得更薄一点吗??
  • 感谢您的代码。在 keon3@gmail.com 上的倒置图像中 , 3@ , ma ,om 这些字母组合在一起有没有其他方法可以让文字更清晰
  • 你可以尝试腐蚀更多,但有一个权衡。你越腐蚀分离每个字符,就会丢失更多的细节。最好的解决方案是使用质量更好的输入图像。作为人类阅读它,很难确定文本。因此,如果计算机读取它,那就更难了
猜你喜欢
  • 1970-01-01
  • 2013-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-01
  • 2014-09-29
  • 2017-08-18
  • 2012-12-25
相关资源
最近更新 更多