2023年11月28日发(作者:2021款奥迪a4l的配置和参数)

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

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

?章?录

?. 车牌定位整体构架

1. 整体思路

?先,车牌定位是车牌识别的第?步也是必要的?步,同时,车牌定位的好坏直接性的决定了车牌识别的好坏,因此车牌定位是?定要尽量

好的实现。对?张图?来说,车牌定位的?个过程其实很简单。

1. 去除噪?

2. 通过颜?特征筛选(或者通过形状筛选)

. 合适的分值的选取

学习?标识别的朋友?定经常和分值打交道把,通过?系列?法选出待选区域,最后评分,没有达到期望,就继续循环,继续评分,直到满

?或者循环停?。

这?的评分当然没有?到神经?络的东西,?是利?选好的掩膜的像素值来评掩膜得到的像素值是255与0,那么我们寻找掩膜的条件是蓝

?,注意这个蓝?,那么是不是可以想象,如果蓝?够多,那么分就够?呢,当然可以,于是可以对每个图像得到的HSV三个通道进?加权

求和,若是分数最够则认定为车牌,?前测试的图?,该?法吗,没有失败的。

?. 代码

\'\'\'

车牌识别

2021/2/24 python3.6 by ksks14

\'\'\'

#

导库

import cv2 as cv

import numpy as np

import 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):

def image_binary(image):

max_value=float(image.max())

min_value=float(image.min())

\'\'\'

这?利??适应?值化以及?动求阈值的?法明显效果不好。因此设置阈值这样设置的效果很容易想到,当图?为?张纯?图时阈值为对应像素值,当图包

2550时,阈值为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]]

#BGRHSV

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

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)

同样如果图像灰度集中在较亮的区域?导致图像偏亮,也可以?灰度拉伸功能来压缩斜率物体灰度区间以改善图像质量

stretchedimage=gray_stretch(gray_image)#

进?灰度拉伸,是因为可以改善图像的质量

\'\'\'进?开运算,?来去除噪声\'\'\'

#

构造卷积核

kernel=cv.getStructuringElement(cv.MORPH_ELLIPSE,(30,30))

#

开运算

openingimage=cv.morphologyEx(stretchedimage,cv.MORPH_OPEN,kernel)

# f(\'1\',\'2\')

获取差分图,两幅图像做差图像图像

strtimage=cv.absdiff(stretchedimage,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()

结果如下:


更多推荐

车牌识别