Opencv(Open Source Computer Vision Library)是一个基于开源发行的跨平台计算机视觉库。OpenCV用C++语言编写,它具有C ++,Python,Java和MATLAB接口,并支持Windows,Linux,Android和Mac OS。
本篇是使用python配合opencv来做图片识别,以识别银行卡上的卡号为例。
安装opencv和辅助的工具库,安装命令如下:win +R —>cmd—>回车
pip install opencv-python
pip install numpy
pip install matplotlib
如下图,就是本次实验的对象,我们的目标就是识别,下面的卡号数字:123456789123
思路:图像处理是步骤一般思路是(1) 图像二值化——>(2)使用掩膜去除杂色——>(3)细化被识别的对象——>(4)做识别处理
以本案例为例,上面的思路说人话就是
(1)将彩色图为灰度图,灰度是取值范围是0~255。因为不同颜色的像素点被做成灰度化后,它的灰度的数值是不同。这样就是给定个范围,把这个范围之外的像素点去掉。
打比方(不是很严谨):比如有一个蓝色方块和一个红色的圆圈,你的目标是识别红色的圆圈,这样二值化后,打个比方红色的灰度是100 ,蓝色的灰度是200.这样给范围要90-120的灰度范围就能去掉蓝色方块,保留红色的圆圈了。
(2)使用一个图层盖住不需要的部分,把不要的部分涂黑。在使用一次二值化把不要的部分进一步去掉。
(3)上面两边已经尽力地把干扰项清除干净了,但是不可能去除到一点干扰都没有的状态,所以这个时候就要细化需要识别的对象,使他从干扰项中凸显出来。提高它被正确识别的可能性。
(4)识别出内容来,这个的方法有很多。本文是识别字符的,所以使用pytesseract这个来工具来进行识别。
完整程序如下:
import cv2 import numpy as np import pytesseract if __name__ == '__main__': img = cv2.imread("D:/780.jpg", 0) # 查询图片的横纵的像素点数量,方便制作掩膜 print(img.shape) # 二值化处理 t1, dst1 = cv2.threshold(img, 150, 255, cv2.THRESH_BINARY) # 创建掩膜 mask = np.zeros(img.shape, np.uint8) # 改变图像的某部分的像素的值 mask[330:380, 50:330] = 255 # cv2.imshow("window1", mask) # 遮盖遮盖不需要的部分 dst4 = cv2.bitwise_and(dst1, mask) cv2.imshow("window5", dst4) # 反二值化处理,去除噪点和掩膜,并突出特征 t5, dst5 = cv2.threshold(dst4, 127, 255, cv2.THRESH_BINARY_INV) kernel = np.ones((3, 3), np.uint8) # 设定要处理的内核大小 dst6 = cv2.erode(dst5, kernel, iterations=1) # 腐蚀图像 cv2.imshow("window2", img) cv2.imshow("window6", dst6) # 使用pytesseract识别 # 指定识别的内容为数字,0~9 custom_config = r'--oem 3 --psm 6 -c tessedit_char_whitelist=0123456789' text = pytesseract.image_to_string(dst6, config=custom_config) print(text) # cv2.imshow("window3", dst5) cv2.waitKey() cv2.destroyAllWindows()
D:/780.jpg :这个是图片放置的路径。
二值化后的图片:
加了掩膜后的图片
反二值化处理并腐蚀后的图片
这样的图片已经算是清楚的了,黑白分明的。虽然有点麻麻赖赖的,实时足够识别了。
识别结果如下: