python-opencv实战:车牌识别(一):精度还不错的车牌定位

python-opencv实战:车牌识别(一):精度还不错的车牌定位,第1张

概述本文为基于python的opencv的车牌定位源码+讲解。文章目录一.车牌定位整体构架1.整体思路2.分析原理3.算法构造①.灰度拉伸算法②.二值化的阈值选取③.合适的分值的选取二.代码总结一.车牌定位整体构架1.整体思路首先,车牌定位是车牌识别的第一步也是必

本文为基于python的opencv的车牌定位源码+讲解。


文章目录一. 车牌定位整体构架1. 整体思路2. 分析原理3. 算法构造①. 灰度拉伸算法②. 二值化的阈值选取③. 合适的分值的选取二. 代码总结

一. 车牌定位整体构架1. 整体思路

首先,车牌定位是车牌识别的第一步也是必要的一步,同时,车牌定位的好坏直接性的决定了车牌识别的好坏,因此车牌定位是一定要尽量好的实现。对一张图片来说,车牌定位的几个过程其实很简单。

去除噪音通过颜色特征筛选(或者通过形状筛选)通过形态特征再筛选(或通过颜色特征再筛选)定位候选区域列表选出最优的候选区域画出矩形,返回矩形的对角顶点。

其实过程并不复杂,但是每一步的各种 *** 作混杂在一块就令如我这样的小白懵。不过问题不大,我们分开来看。

2. 分析原理

选择从通过形态特征先筛选入手。
先将图片转化为灰度图(边缘检测和轮廓识别需要灰度图),要去除噪音,防止不必要的干扰,通过灰度拉伸算法获取效果更良好的灰度图。做边缘检测,轮廓发现,之后找出所有的矩形轮廓,利用国内车牌的特征选出最优的几个轮廓。接着对这几个轮廓进行色彩特征分析,转化为HSV色彩空间(为了使用inrange方法找出掩膜),找出掩膜,利用算法求得每个掩膜的评分,选出最优评分的掩膜,并返回其图片下标。是不是一气呵成。

3. 算法构造

要实现良好的车牌定位,肯定是不能直接用其固定好的API因为,API终究是局限于语言,它考虑的没有办法像活生生的人那么多。如果你足够优秀的话,一定程度上是可以超越API的。

①. 灰度拉伸算法

灰度拉伸又叫对比度拉伸,它是最基本的一种灰度变换,使用的是最简单的分段线性变换函数,它的主要思想是提高图像处理时灰度级的动态范围。它可以改善图像,说的白一点,它可以让有些不可见的地方变得可见。这是防止图片的拍摄角度或者光线问题导致车牌不清晰。
公式:g(x,y) = 255 / (B - A) * [f(x,y) - A]

②. 二值化的阈值选取

图像二值化时边缘检测的必备,我们学习过二值化,不论是自适应二值化,还是otus二值化,其自动算出的阈值在部分图的表现很好,但我们不能直接带入车牌图像,因为API提供的二值化时考虑全图,或者一个个部分块,但是我们需要的是足够清晰不会影响到车牌轮廓的二值化。因此选择自己构造阈值。
个人建议利用阈值如下:

ret=max_value-(max_value-min_value)/2

其中为最大像素点和最小像素点,不妨思考一下,如果图片为一张纯色图,那么阈值就为该像素值。如果图片是最大为250最小为0那么阈值为122,蓝色和白色为高像素值,这样无论如何都能找出其合适的轮廓。

③. 合适的分值的选取

学习目标识别的朋友一定经常和分值打交道把,通过一系列方法选出待选区域,最后评分,没有达到期望,就继续循环,继续评分,直到满足或者循环停止。
这里的评分当然没有用到神经网络的东西,而是利用选好的掩膜的像素值来评掩膜得到的像素值是255与0,那么我们寻找掩膜的条件是蓝色,注意这个蓝色,那么是不是可以想象,如果蓝色够多,那么分就够高呢,当然可以,于是可以对每个图像得到的HSV三个通道进行加权求和,若是分数最够则认定为车牌,目前测试的图片,该方法吗,没有失败的。

二. 代码
'''车牌识别2021/2/24 python3.6 by ksks14'''#导库import cv2 as cvimport numpy as npimport os#方法#导入图片资源 path为路径def load_image(path):    src=cv.imread(path)    return src#灰度拉伸方法 '''它可以有选择的拉伸某段灰度区间以改善输出图像,如果一幅图像的灰度集中在较暗的区域而导致图像偏暗,可以用灰度拉伸功能来拉伸(斜率>1)物体灰度区间以改善图像;同样如果图像灰度集中在较亮的区域而导致图像偏亮,也可以用灰度拉伸功能来压缩(斜率<1)物体灰度区间以改善图像质量。灰度拉伸定义:灰度拉伸,也称对比度拉伸,是一种简单的线性点运算。作用:扩展图像的      直方图,使其充满整个灰度等级范围内公式:g(x,y) = 255 / (B - A) * [f(x,y) - A],其中,A = min[f(x,y)],最小灰度级;B = max[f(x,y)],最大灰度级;     f(x,y)为输入图像,g(x,y)为输出图像缺点:如果灰度图像中最小值A=0,最大值B=255,则图像没有什么改变'''def gray_stretch(image):    max_value=float(image.max())    min_value=float(image.min())    for i in range(image.shape[0]):        for j in range(image.shape[1]):            image[i,j]=(255/(max_value-min_value)*image[i,j]-(255*min_value)/(max_value-min_value))    return image'''图像整体二值化'''def image_binary(image):    max_value=float(image.max())    min_value=float(image.min())     '''    这里利用自适应二值化以及自动求阈值的方法明显效果不好。因此设置阈值这样设置的效果很容易想到,当图片为一张纯色图时阈值为对应像素值,当图包含    255与0时,阈值为122,总体的适应的效果会比较好。方法返回二值图    '''    ret=max_value-(max_value-min_value)/2    ret,thresh=cv.threshold(image,ret,255,cv.THRESH_BINARY)    return thresh'''矩形轮廓角点,寻找到矩形之后记录角点,用来做参考以及画图。'''def find_rectangle(contour):    y,x=[],[]    for value in contour:        y.append(value[0][0])        x.append(value[0][1])    return [min(y),min(x),max(y),max(x)]'''车牌定位方法,需要两个参数,第一个是用来寻找位置,第二个为原图,用来绘制矩形。寻找位置的图片为经过几次形态学 *** 作的图片。这里利用权值的 *** 作,实现了定位的最高概率。'''def loacte_plate(image,after):    '''    定位车牌号    '''    #寻找轮廓    contours,hIErarchy=cv.findContours(image,cv.RETR_EXTERNAL,cv.CHAIN_APPROX_SIMPLE)    img_copy = after.copy()    #找出最大的三个区域    solving=[]    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])        solving.append([r,a,s])    #通过参考选出面积最大的区域    solving=sorted(solving,key=lambda b: b[1])[-3:]    #颜色识别    maxweight,maxindex=0,-1    for i in range(len(solving)):#        wait_solve=after[solving[i][0][1]:solving[i][0][3],solving[i][0][0]:solving[i][0][2]]        #BGR转HSV        hsv=cv.cvtcolor(wait_solve,cv.color_BGR2HSV)        #蓝色车牌的范围 Hsv色彩空间的设置。        lower=np.array([100,50,50])        upper=np.array([140,255,255])        #利用inrange找出掩膜        mask=cv.inRange(hsv,lower,upper)        #计算权值用来判断。        w1=0        for m in mask:            w1+=m/255        w2=0        for n in w1:            w2+=n        #选出最大权值的区域        if w2>maxweight:            maxindex=i            maxweight=w2    return solving[maxindex][0]  '''框出车牌 获取位置坐标,并返回图像'''#对图像的预处理def find_plates(image):    image=cv.resize(image,(400,int(400 * image.shape[0] / image.shape[1])))    #转换为灰度图像    gray_image=cv.cvtcolor(image,cv.color_BGR2GRAY)    #灰度拉伸    #如果一幅图像的灰度集中在较暗的区域而导致图像偏暗,可以用灰度拉伸功能来拉伸(斜率>1)物体灰度区间以改善图像;    # 同样如果图像灰度集中在较亮的区域而导致图像偏亮,也可以用灰度拉伸功能来压缩(斜率<1)物体灰度区间以改善图像质量    @R_96_4041@image=gray_stretch(gray_image)#进行灰度拉伸,是因为可以改善图像的质量    '''进行开运算,用来去除噪声'''    #构造卷积核    kernel=cv.getStructuringElement(cv.MORPH_ELliPSE,(30,30))    #开运算    openingimage=cv.morphologyEx(@R_96_4041@image,cv.MORPH_OPEN,kernel)    #获取差分图,两幅图像做差  cv2.absdiff('图像1','图像2')    strtimage=cv.absdiff(@R_96_4041@image,openingimage)    #图像二值化    binaryimage=image_binary(strtimage)    #canny边缘检测    canny=cv.Canny(binaryimage,binaryimage.shape[0],binaryimage.shape[1])    #5 24效果最好    kernel=np.ones((5,24),np.uint8)    closingimage=cv.morphologyEx(canny,cv.MORPH_CLOSE,kernel)    openingimage=cv.morphologyEx(closingimage,cv.MORPH_OPEN,kernel)    #11 6的效果最好    kernel=np.ones((11,6),np.uint8)    openingimage=cv.morphologyEx(openingimage,cv.MORPH_OPEN,kernel)    #消除小区域,定位车牌位置    rect=loacte_plate(openingimage,image)#rect包括轮廓的左上点和右下点,长宽比以及面积    #展示图像    cv.imshow('image',image)    cv.rectangle(image, (rect[0]-5, rect[1]-5), (rect[2]+5,rect[3]+5), (0, 255, 0), 2)    cv.imshow('after', image)    cv.waitKey(0)    cv.destroyAllwindows()def runing():     file_path='.\plates'    for filewalks in os.walk(file_path):        for files in filewalks[2]:            print('正在处理',os.path.join(filewalks[0],files))            find_plates(load_image(os.path.join(filewalks[0],files)))runing()

结果如下:


总结

搞定度车牌定位不仅仅是算法需要一些自己设置一些改进,同时对卷积核的设定也十分重要,建议大家可以试一下,用循环遍历的方法去找最优,也可以从数学角度分析。这里就不多阐述了。之后会写关于字符分割的博客,这俩步基础完了就该到深度学习了。距离比赛还有一个月。。我时间也不多了。

总结

以上是内存溢出为你收集整理的python-opencv实战:车牌识别(一):精度还不错的车牌定位全部内容,希望文章能够帮你解决python-opencv实战:车牌识别(一):精度还不错的车牌定位所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1189319.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-03
下一篇 2022-06-03

发表评论

登录后才能评论

评论列表(0条)

保存