目标是使用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
答案 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的二进制图像:
在上图进行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
结果:
我在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)
我们可以使用: