【python 图像识别】python 身份证号码识别

一、需求分析
识别身份证图片上的身份证号码。
如:
这里写图片描述

二、python实现源代码

# !/usr/bin/python
#-*-coding:utf-8-*-
import sys
reload(sys)
sys.setdefaultencoding('utf-8')

import time
time1 = time.time()
from PIL import Image
import pytesseract

###########二值化算法
def binarizing(img,threshold):
    pixdata = img.load()
    w, h = img.size
    for y in range(h):
        for x in range(w):
            if pixdata[x, y] < threshold:
                pixdata[x, y] = 0
            else:
                pixdata[x, y] = 255
    return img


###########去除干扰线算法
def depoint(img):   #input: gray image
    pixdata = img.load()
    w,h = img.size
    for y in range(1,h-1):
        for x in range(1,w-1):
            count = 0
            if pixdata[x,y-1] > 245:
                count = count + 1
            if pixdata[x,y+1] > 245:
                count = count + 1
            if pixdata[x-1,y] > 245:
                count = count + 1
            if pixdata[x+1,y] > 245:
                count = count + 1
            if count > 2:
                pixdata[x,y] = 255
    return img


########身份证号码识别
def identity_OCR(pic_path):
    #####身份证号码截图
    img1=Image.open(pic_path)
    w,h=img1.size
    ##将身份证放大3倍
    out=img1.resize((w*3,h*3),Image.ANTIALIAS)
    region = (125*3,200*3,370*3,250*3)
    #裁切身份证号码图片
    cropImg = out.crop(region)
    # 转化为灰度图
    img= cropImg.convert('L')
    # 把图片变成二值图像。
    img1=binarizing(img,100)
    img2=depoint(img)
    code = pytesseract.image_to_string(img2)
    print "识别该身份证号码是:"+str(code)



if __name__ == '__main__':
    pic_path="/root/image/331.jpg"
    identity_OCR(pic_path)
    time2 = time.time()
    print u'总共耗时:' + str(time2 - time1) + 's'


三、效果(照片清晰 都能完整识别出来)

这里写图片描述

这里写图片描述

  • 19
    点赞
  • 127
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 11
    评论
基于Python的二代居民身份证号码识别系统可以使用OpenCV和Tesseract OCR库实现。以下是一个简单的实现步骤: 1. 安装OpenCV和Tesseract OCR库。 2. 使用OpenCV读取身份证照片并进行预处理,包括图像增强、二值化、去噪等操作。 ```python import cv2 # 读取身份证照片 img = cv2.imread('id_card.jpg') # 灰度化 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 图像增强 enhanced = cv2.equalizeHist(gray) # 二值化 _, thresh = cv2.threshold(enhanced, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU) # 去噪 kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3)) cleaned = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel) ``` 3. 使用OpenCV进行身份证号码区域的定位和提取。 ```python # 身份证号码区域的定位 contours, _ = cv2.findContours(cleaned, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) rects = [cv2.boundingRect(cnt) for cnt in contours] # 身份证号码区域的提取 id_num_rect = rects[2] id_num_img = cleaned[id_num_rect[1]:id_num_rect[1] + id_num_rect[3], id_num_rect[0]:id_num_rect[0] + id_num_rect[2]] ``` 4. 使用Tesseract OCR库进行身份证号码识别。 ```python import pytesseract # 身份证号码识别 id_num = pytesseract.image_to_string(id_num_img, lang='chi_sim') ``` 完整代码如下: ```python import cv2 import pytesseract # 读取身份证照片 img = cv2.imread('id_card.jpg') # 灰度化 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 图像增强 enhanced = cv2.equalizeHist(gray) # 二值化 _, thresh = cv2.threshold(enhanced, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU) # 去噪 kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3)) cleaned = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel) # 身份证号码区域的定位 contours, _ = cv2.findContours(cleaned, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) rects = [cv2.boundingRect(cnt) for cnt in contours] # 身份证号码区域的提取 id_num_rect = rects[2] id_num_img = cleaned[id_num_rect[1]:id_num_rect[1] + id_num_rect[3], id_num_rect[0]:id_num_rect[0] + id_num_rect[2]] # 身份证号码识别 id_num = pytesseract.image_to_string(id_num_img, lang='chi_sim') # 输出识别结果 print('身份证号码:', id_num) # --相关问题--:

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

东华果汁哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值