【问题标题】:How to differentiate Passport and PAN card Scanned images in python如何区分护照和PAN卡在python中扫描的图像
【发布时间】:2019-06-03 06:02:53
【问题描述】:

目标是使用 Opencv 识别输入的扫描图像是护照或 PAN 卡。

我使用了skimage的structure_similarity(compare_ssim)方法来比较输入扫描图像与Passport和PAN卡模板的图像。

但在这两种情况下我都得分低。

这是我尝试过的代码

from skimage.measure import compare_ssim as ssim
import matplotlib.pyplot as plt
import numpy as np
import cv2enter code here

img1 = cv2.imread('PAN_Template.jpg', 0)
img2 = cv2.imread('PAN_Sample1.jpg', 0)

def prepare_img(im):
    size = 300, 200
    im = cv2.resize(im, size)
    return im

img1 = prepare_img(img1)
img2 = prepare_img(img2)

def compare_images(imageA, imageB):
    s = ssim(imageA, imageB)
    return s

ssim = compare_images(img1, img2)

print(ssim)

将 PAN 卡模板与 Passport 进行比较,我的 ssim 分数为 0.12 并将 PAN 卡模板与 PAN 卡进行比较,得分为 0.20

由于两个分数非常接近,我无法通过代码区分它们。

如果有人有任何其他解决方案或方法,请提供帮助。

这是一个示例图片 PAN Scanned Image

【问题讨论】:

  • 发布一些您正在处理的示例图像
  • 你为什么不根据它们的文本内容比较图像。您可以对图像进行一些预处理操作并执行OCR以提取文本数据,并根据ocr输出字符串中的某些固定关键字集将它们分类为Pan card或Passport。
  • @flamelite 感谢您的回复。问题是使用 pytesseract (OCR) 我得到了不均匀的字符。我已经对图像进行了一些预处理,但精度仍然没有提高多少。
  • @sssm 请张贴示例图片,我会尝试 ocr 看看能否找到更好的输出。
  • @flamelite 我在上面发布了一张示例图片供您参考。

标签: python-3.x opencv image-processing computer-vision


【解决方案1】:

您还可以通过这 2 幅图像的均方误差 (MSE) 来比较 2 幅图像。

def mse(imageA, imageB):
    # the 'Mean Squared Error' between the two images is the
    # sum of the squared difference between the two images;
    # NOTE: the two images must have the same dimension
    err = np.sum((imageA.astype("float") - imageB.astype("float")) ** 2)
    err /= float(imageA.shape[0] * imageA.shape[1])

    # return the MSE, the lower the error, the more "similar"
    # the two images are
    return err

【讨论】:

    【解决方案2】:

    据我了解,Pan card 和 Passport 图片包含不同的文本数据,所以我相信 OCR 可以解决这个问题。 您需要做的就是使用任何 OCR 库(如 Tesseract)从图像中提取文本数据,并在文本数据中查找一些预定义的关键词来区分图像。

    这是一个简单的 Python 脚本,展示了使用 pyteseract 模块进行的图像预处理和 OCR:

        img = cv2.imread("D:/pan.jpg")
        gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
        ret,th1 = cv2.threshold(gray,127,255,cv2.THRESH_BINARY)
        cv2.imwrite('filterImg.png', th1)
        pilImg = Image.open('filterimg.png')
        text = pytesseract.image_to_string(pilImg)
        print(text.encode("utf-8"))
    

    以下是用于 OCR 的二进制图像:

    对上图做OCR后得到如下字符串数据:

    esraax 框架 EP aca ae ~ 所得税部门 Ld GOVT。印度的 wrtterterad sg 永久帐号。卡\xe2\x80\x98yf KFWPS6061C PEF 呕吐; ae Reviavs /父亲的名字。 e. 苏迪尔·辛格:。 ,

    虽然这些文本数据包含噪音,但我相信它足以完成工作。

    【讨论】:

    • 谢谢伙计。我们也可以使用神经网络来定位和提取文本。
    • 是的,当然可以。这是arxiv.org/abs/1704.03155 的链接。虽然您也可以使用基本的图像处理操作检测此类图像中的文本,但这是我尝试过的链接github.com/avi9839/panocr/blob/master/src/filter.py。我仅在您的图像上测试此方法,目前不完整,我将更新存储库。很快。
    【解决方案3】:

    另一个 OCR 解决方案是使用 Fred's Scripts 中的 TextCleaner ImageMagick 脚本。一个解释如何安装和使用它的教程(在 Windows 上)是available here

    使用的脚本:

    C:/cygwin64/bin/textcleaner -g -e normalize -f 20 -o 20 -s 20 C:/Users/Link/Desktop/id.png C:/Users/Link/Desktop/out.png
    

    结果:

    我使用 Tesseract 对此应用了 OCR(我使用的是版本 4),结果如下:

    fart
    INCOME TAX DEPARTMENT : GOVT. OF INDIA
    wort cra teat ears -
    Permanent Account Number Card
    KFWPS6061C
    
    
    
    
    
    TT aa
    MAYANK SUDHIR SINGH el
    
    far aT ary /Father's Name
    SUDHIR SINGH
    
    Wa RT /Date of Birth den. +
    
    06/01/1997 genge / Signature
    

    OCR 代码:

    import cv2
    from PIL import Image
    import tesserocr as tr
    
    number_ok = cv2.imread("C:\\Users\\Link\\Desktop\\id.png")
    
    blur = cv2.medianBlur(number_ok, 1)
    cv2.imshow('ocr', blur)
    
    pil_img = Image.fromarray(cv2.cvtColor(blur, cv2.COLOR_BGR2RGB))
    
    api = tr.PyTessBaseAPI()
    
    try:
        api.SetImage(pil_img)
        boxes = api.GetComponentImages(tr.RIL.TEXTLINE, True)
        text = api.GetUTF8Text()
    
    finally:
        api.End()
    
    print(text)
    
    cv2.waitKey(0)
    

    现在,这不能回答您的问题(护照或 PAN 卡),但您可以从这里开始。

    【讨论】:

      【解决方案4】:

      执行 OCR 可能是此类图像分类的解决方案,但对于模糊或未正确曝光的图像可能会失败。而且它可能比新的深度学习方法慢。

      您可以使用对象检测(Tensorflow 或任何其他库)来训练两类不同的图像,即 PAN 和 Passport。对于微调预训练模型,您也不需要太多数据。而且据我了解,PAN 和护照的背景颜色不同,所以我想它会非常准确。

      Tensorflow 对象检测:Link

      现在 OpenCV 还支持对象检测,无需安装任何新库(即 Tensorflow、caffee 等)。 OpenCV 中基于 YOLO 的目标检测可以参考this 文章。

      【讨论】:

        【解决方案5】:

        我们可以使用:

        • 直方图比较 - 最简单和最快的方法,使用它我们将获得直方图之间的相似性。
        • 模板匹配 - 搜索并找到模板图像的位置,使用它我们可以在较大的图像中找到较小的图像部分。 (如 PAN 卡中的一些常见模式)。
        • 特征匹配 - 从一张图像中提取的特征和相同的特征将在另一张图像中被识别,即使图像旋转或倾斜。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-04-13
          • 2020-08-23
          • 1970-01-01
          • 2020-10-04
          • 1970-01-01
          • 2022-06-22
          • 2015-03-06
          • 2011-10-15
          相关资源
          最近更新 更多