使用Python提取身份證上的信息2

使用Python提取身份證上的信息2

來自專欄帶土的Python應用

這裡利用pytesseract,opencv3等庫提取身份證上某些有用的信息(不帶照片的那一面)。如果圖像的解析度不是很高,首先需要對圖像通過插值的方法,提高圖像的解析度,這樣才能較好的識別身份證的信息。因為不能像帶人臉的那一面,通過人臉特徵將身份證轉正,所以需要圖片里的身份證方置的較正。

%matplotlib inline%config InlineBackend.figure_format = retinaimport pytesseractimport cv2import matplotlib.pyplot as pltimport matplotlib.patches as mpatchesfrom skimage import ioimport numpy as npimport pandas as pdimport re

先面試讀取圖像,然後放大圖像:

image = io.imread("身份證背面3.jpg")print(image.shape)high,width = image.shape[0:2]## 圖像放大兩倍 ,4x4像素鄰域的雙三次插值image = cv2.resize(image,(width*4,high*4), interpolation=cv2.INTER_CUBIC)plt.imshow(image)plt.axis("off")plt.show()print(image.shape)(403, 640, 3)(1612, 2560, 3)

接下來使用pytesseract庫中的方法,直接識別圖像中的中文:

## 可以通過pytesseract庫來查看檢測效果,但是結果並不是很好text = pytesseract.image_to_string(image,lang=chi_sim)print(text)簽發機關 建甌市公安局有效期隔 2012.06.25-2022.O6.25

可以發現,已經可以識別一些信息了,但是並沒有完全識別所有中文。

下面對圖像進行二值化處理,在識別中文:

## 對圖像進行處理,轉化為灰度圖像=>二值圖像imagegray = cv2.cvtColor(image,cv2.COLOR_RGB2GRAY)retval, imagebin = cv2.threshold(imagegray, 120, 255, cv2.THRESH_OTSU + cv2.THRESH_BINARY)plt.imshow(imagebin,cmap=plt.cm.gray)plt.axis("off")plt.show()## 再次通過pytesseract庫來查看檢測效果,但是結果並不是很好text = pytesseract.image_to_string(imagebin,lang=chi_sim)print(text)`『熹熹′"′「〕′…′_′′`…′_′′`~…`〈_" 中華人民共和國居民身份證簽發機關 建甌市公安局有效期隔 2012-06.25-2022.06.25

可以發現有用的信息均識別正確。

接下來提取有用的內容:

## 提取識別的內容textlist = text.split("
")textdf = pd.DataFrame({"text":textlist})textdf["textlen"] = textdf.text.apply(len)## 去除長度《=1的行textdf = textdf[textdf.textlen > 1].reset_index(drop = True)textdf text textlen0 `『熹熹′"′「〕′…′_′′`…′_′′`~…`〈_" 中華人民共和國 391 居民身份證 52 簽發機關 建甌市公安局 113 有效期隔 2012-06.25-2022.06.25 26

進一步處理:

## 提取相應的信息print("第一行:",textdf.text[0][-7:])print("=====================")print("第二行:",textdf.text[1][-5:])print("=====================")print("簽發機關:",textdf.text[2].split(" ")[-1])print("=====================")## 提取時間信息timetext = textdf.text[3]timetext = re.findall("d+",timetext)timetextprint("有效開始時間:",".".join(timetext[0:3]))print("=====================")print("失效時間:",".".join(timetext[3:]))print("=====================")第一行: 中華人民共和國=====================第二行: 居民身份證=====================簽發機關: 建甌市公安局=====================有效開始時間: 2012.06.25=====================失效時間: 2022.06.25=====================

因為這一面的文字大小差距懸殊,而且缺少定點陣圖像傾斜的因素,所以對照片的要求更高一點。相應的上面的方法還需要進一步的優化來提高適用性。身份證照片來自網路圖。

推薦閱讀:

辦證不用回老家,如何在異地補辦身份證?
教你辨別客戶真假身份證!一定要知道||身份證真假驗證-信易查
公安部放大招了!這些身份證陷阱你終於不用跳了!
移動端身份證識別
明年起坐飛機將實行刷身份證登機

TAG:身份證 | Python | OCR光學字元識別 |