如何在python

时间:2019-01-08 14:09:47

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

目标是使用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卡模板与护照进行比较,我的模拟得分为0.12 并将PAN卡模板与PAN卡进行比较,得分为0.20

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

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

这是示例图片 PAN Scanned Image

5 个答案:

答案 0 :(得分:0)

您还可以通过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

答案 1 :(得分:0)

据我了解,Pan卡和Passport图像包含不同的文本数据,因此我相信OCR可以解决此问题。 您要做的就是-使用Tesseract之类的任何OCR库从图像中提取文本数据,并在文本数据中寻找一些预定义的关键字来区分图像。

这是一个简单的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的二进制图像:

enter image description here

在上图进行OCR之后,我得到了以下字符串数据:

esraax fram EP aca ae 〜税收部门Ld GOVT。印度 wrtterterad sg 永久帐号。卡\ xe2 \ x80 \ x98yf KFWPS6061C PEF vom; e Reviavs /父亲的名字。 e。 SUDHIR SINGH:。 ,

尽管此文本数据包含杂音,但我认为它足以完成工作。

答案 2 :(得分:0)

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

使用的脚本:

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

结果:

res

我在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卡),但这是您可以开始的一个好地方。

答案 3 :(得分:0)

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

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

Tensorflow对象检测:Link

如今,OpenCV还支持对象检测而无需安装任何新库(例如Tensorflow,caffee等)。您可以参考this文章,了解OpenCV中基于YOLO的对象检测。

答案 4 :(得分:0)

我们可以使用:

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