初学Python.Opencv,想用它做个实例解决车牌号检测。

车牌号检测需要分为四个部分:1.车辆图像获取、2.车牌定位、3.车牌字符分割和4.车牌字符识别

在百度查到了车牌识别部分车牌定位和车牌字符分割,先介绍车牌定位部分

车牌定位需要用到的是图片二值化为黑白后进canny边缘检测后多次进行开运算与闭运算用于消除小块的区域,保留大块的区域,后用cv2.rectangle选取矩形框,从而定位车牌位置

车牌字符的分割前需要准备的是只保留车牌部分,将其他部分均变为黑色背景。这里我采用cv2.grabCut方法,可将图像分割成前景与背景。分割完成后,再经过二值化为黑白图后即可进行字符分割。由于图像中只有黑色和白色像素,因此我们需要通过图像的白色像素和黑色像素来分割开字符。即分别通过判断每一行每一列的黑色白色像素值的位置,来定位出字符。具体程序附下

import cv2
import numpy as npdef stretch(img):'''图像拉伸函数'''maxi=float(img.max())mini=float(img.min())for i in range(img.shape[0]):for j in range(img.shape[1]):img[i,j]=(255/(maxi-mini)*img[i,j]-(255*mini)/(maxi-mini))return imgdef dobinaryzation(img):'''二值化处理函数'''maxi=float(img.max())mini=float(img.min())x=maxi-((maxi-mini)/2)#二值化,返回阈值ret  和  二值化操作后的图像threshret,thresh=cv2.threshold(img,x,255,cv2.THRESH_BINARY)#返回二值化后的黑白图像return threshdef find_rectangle(contour):'''寻找矩形轮廓'''y,x=[],[]for p in contour:y.append(p[0][0])x.append(p[0][1])return [min(y),min(x),max(y),max(x)]def locate_license(img,afterimg):'''定位车牌号'''img,contours,hierarchy=cv2.findContours(img,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)#找出最大的三个区域block=[]for c in contours:#找出轮廓的左上点和右下点,由此计算它的面积和长度比r=find_rectangle(c)a=(r[2]-r[0])*(r[3]-r[1])   #面积s=(r[2]-r[0])*(r[3]-r[1])   #长度比block.append([r,a,s])#选出面积最大的3个区域block=sorted(block,key=lambda b: b[1])[-3:]#使用颜色识别判断找出最像车牌的区域maxweight,maxindex=0,-1for i in range(len(block)):b=afterimg[block[i][0][1]:block[i][0][3],block[i][0][0]:block[i][0][2]]#BGR转HSVhsv=cv2.cvtColor(b,cv2.COLOR_BGR2HSV)#蓝色车牌的范围lower=np.array([100,50,50])upper=np.array([140,255,255])#根据阈值构建掩膜mask=cv2.inRange(hsv,lower,upper)#统计权值w1=0for m in mask:w1+=m/255w2=0for n in w1:w2+=n#选出最大权值的区域if w2>maxweight:maxindex=imaxweight=w2return block[maxindex][0]def find_license(img):'''预处理函数'''m=400*img.shape[0]/img.shape[1]#压缩图像img=cv2.resize(img,(400,int(m)),interpolation=cv2.INTER_CUBIC)#BGR转换为灰度图像gray_img=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)#灰度拉伸stretchedimg=stretch(gray_img)'''进行开运算,用来去除噪声'''r=16h=w=r*2+1kernel=np.zeros((h,w),np.uint8)cv2.circle(kernel,(r,r),r,1,-1)#开运算openingimg=cv2.morphologyEx(stretchedimg,cv2.MORPH_OPEN,kernel)#获取差分图,两幅图像做差  cv2.absdiff('图像1','图像2')strtimg=cv2.absdiff(stretchedimg,openingimg)#图像二值化binaryimg=dobinaryzation(strtimg)#canny边缘检测canny=cv2.Canny(binaryimg,binaryimg.shape[0],binaryimg.shape[1])'''消除小的区域,保留大块的区域,从而定位车牌'''#进行闭运算kernel=np.ones((5,19),np.uint8)closingimg=cv2.morphologyEx(canny,cv2.MORPH_CLOSE,kernel)#进行开运算openingimg=cv2.morphologyEx(closingimg,cv2.MORPH_OPEN,kernel)#再次进行开运算kernel=np.ones((11,5),np.uint8)openingimg=cv2.morphologyEx(openingimg,cv2.MORPH_OPEN,kernel)#消除小区域,定位车牌位置rect=locate_license(openingimg,img)return rect,imgdef cut_license(afterimg,rect):'''图像分割函数'''#转换为宽度和高度rect[2]=rect[2]-rect[0]rect[3]=rect[3]-rect[1]rect_copy=tuple(rect.copy())rect=[0,0,0,0]#创建掩膜mask=np.zeros(afterimg.shape[:2],np.uint8)#创建背景模型  大小只能为13*5,行数只能为1,单通道浮点型bgdModel=np.zeros((1,65),np.float64)#创建前景模型fgdModel=np.zeros((1,65),np.float64)#分割图像cv2.grabCut(afterimg,mask,rect_copy,bgdModel,fgdModel,5,cv2.GC_INIT_WITH_RECT)mask2=np.where((mask==2)|(mask==0),0,1).astype('uint8')img_show=afterimg*mask2[:,:,np.newaxis]return img_showdef deal_license(licenseimg):'''车牌图片二值化'''#车牌变为灰度图像gray_img=cv2.cvtColor(licenseimg,cv2.COLOR_BGR2GRAY)#均值滤波  去除噪声kernel=np.ones((3,3),np.float32)/9gray_img=cv2.filter2D(gray_img,-1,kernel)#二值化处理ret,thresh=cv2.threshold(gray_img,120,255,cv2.THRESH_BINARY)return threshdef find_end(start,arg,black,white,width,black_max,white_max):end=start+1for m in range(start+1,width-1):if (black[m] if arg else white[m])>(0.98*black_max if arg else 0.98*white_max):end=mbreakreturn endif __name__=='__main__':img=cv2.imread('../image/carnumber7.jpg',cv2.IMREAD_COLOR)#预处理图像rect,afterimg=find_license(img)#框出车牌号cv2.rectangle(afterimg,(rect[0],rect[1]),(rect[2],rect[3]),(0,255,0),2)cv2.imshow('afterimg',afterimg)#分割车牌与背景cutimg=cut_license(afterimg,rect)cv2.imshow('cutimg',cutimg)#二值化生成黑白图thresh=deal_license(cutimg)cv2.imshow('thresh',thresh)cv2.waitKey(0)#分割字符'''判断底色和字色'''#记录黑白像素总和white=[]black=[]height=thresh.shape[0]  #263width=thresh.shape[1]   #400#print('height',height)#print('width',width)white_max=0black_max=0#计算每一列的黑白像素总和for i in range(width):line_white=0line_black=0for j in range(height):if thresh[j][i]==255:line_white+=1if thresh[j][i]==0:line_black+=1white_max=max(white_max,line_white)black_max=max(black_max,line_black)white.append(line_white)black.append(line_black)print('white',white)print('black',black)#arg为true表示黑底白字,False为白底黑字arg=Trueif black_max<white_max:arg=Falsen=1start=1end=2while n<width-2:n+=1#判断是白底黑字还是黑底白字  0.05参数对应上面的0.95 可作调整if(white[n] if arg else black[n])>(0.02*white_max if arg else 0.02*black_max):start=nend=find_end(start,arg,black,white,width,black_max,white_max)n=endif end-start>5:cj=thresh[1:height,start:end]cv2.imshow('cutlicense',cj)cv2.waitKey(0)cv2.waitKey(0)cv2.destroyAllWindows()

这算是识别比较好的一张图片,但是有些图片仍然识别比较差,希望有大神可以提出以下改进意见,但是鉴于自己目前处于初学者状态,就先不深究,等到以后学习精进后再回头解决目前解决不了的问题。感谢阅读。

Python中利用Opencv进行车牌号检测相关推荐

  1. python利用opencv进行车牌号识别定位

    import cv2 import numpy as np import matplotlib.pyplot as plt img=cv2.imread("G:\\IDLE\\timg.jp ...

  2. python中利用opencv简单做图片比对

    python环境中,利用opencv对二值单通道图片进行比对 下面代码中利用了两种比对的方法,一 对图片矩阵(m x m)求解特征值,通过比较特征值是否在一定的范围内,判断图片是否相同.二 对图片矩阵 ...

  3. 在python中利用OpenCV包实现人脸识别

    一.实验环境 1.python3.6环境,numpy包,OpenCV包,pillow包 2.联想T470笔记本电脑,win10系统 3.在测试目录下新建两个文件夹,一个是Facedata用于存放采集的 ...

  4. 深度学习和目标检测系列教程 15-300:在 Python 中使用 OpenCV 执行 YOLOv3 对象检测

    @Author:Runsen 上次讲了yolov3,这是使用yolov3的模型通过opencv的摄像头来执行YOLOv3 对象检测. 导入所需模块: import cv2 import numpy a ...

  5. python中利用opencv对图片进行缩放

    import cv2if __name__ == '__main__':img = cv2.imread(r'C:\Users\Administrator\Desktop\img1791.png')h ...

  6. python基于opencv的手势识别_怎么在Python3.5 中利用OpenCV实现一个手势识别功能

    怎么在Python3.5 中利用OpenCV实现一个手势识别功能 发布时间:2020-12-22 11:56:32 来源:亿速云 阅读:67 作者:Leah 怎么在Python3.5 中利用OpenC ...

  7. opencv检测图片失焦 python_如何在Python中使用OpenCV执行模糊检测

    如何在Python中使用OpenCV执行模糊检测 目标检测 最后更新 2020-10-12 14:23 阅读 154 最后更新 2020-10-12 14:23 阅读 154 目标检测 ##FlyAI ...

  8. 在 Python 中使用 OpenCV 高斯模糊我这张的丑脸

    @Author:Runsen 谁都无法否认,长得好看的人就是更具有吸引力,赏心悦目谁都喜欢.好看的人无论在职场或情场,都一定更占优势. 但是,此「颜值」非彼「颜值」.一说到「颜值」,大部分想到的是脸蛋 ...

  9. python中利用re模块正则表达式匹配ip地址

    python中利用正则表达式判断ipv4地址是否合法 ip地址的范围为0.0.0.0-255.255.255.255,分成四段,则每段的范围都是0-255,因此,以一段进行分析: 在进行书写匹配规则时 ...

最新文章

  1. python获取方法的装饰方法_python – 在一个方法上得到装饰器名称的内省?
  2. 关于VECTOR和DEQUE
  3. 4测试命令_局域网带宽测试工具-iPerf3
  4. python基础===将Flask用于实现Mock-server
  5. 编程开发之--java多线程学习总结(2)同步代码块
  6. 如何设计安全的用户登录功能
  7. 深入解读MySQL8.0 新特性 :Crash Safe DDL 1
  8. BUAA_OO_第二单元
  9. 电子书 Java程序员面试宝典(第4版).pdf
  10. 嵌入式开发比单片机开发难?
  11. 网站搭建的流程是什么
  12. 看漫画学电子,非常精彩!有些概念以前模糊现在真的懂了
  13. 计算机高级工程师一般工资多少,高级工程师年薪是多少 分为哪些级别
  14. 微信开发 免费服务器,微信开发详解:[1]免费服务器
  15. ToG产品_产品白皮书框架_2019_003
  16. 推荐几本这个系列封面的编程书,涉及Python、计算机图形学、Linux
  17. python、matplotlib画箱体图检验异常值
  18. 流体力学实验室设备实训设备自循环水击实验装置
  19. JDBC编程和DAO设计模式
  20. RTX移植STM32F103,超详细~

热门文章

  1. 十分钟开发物联网:智能气象站(4G版)
  2. 立个Flag,2019加油!
  3. Android12 Launcher3 的一些修改记录
  4. 【金猿信创展】恒生电子——全栈式信创解决方案,助力金融信创行稳致远
  5. 语音信号短时平稳特性
  6. MySQL自定义函数实例
  7. 【51nod】2059 上台阶 easy
  8. 在seo中,怎么写原创文章。
  9. vba 之判断工作表是否处于保护状态:Worksheets.ProtectContents
  10. DM8 控制文件转换为文本文件