前言
定位车牌位置有很多方法可以成功的定位,而每种方法都有各自的优缺点。
提示:以下是本篇文章正文内容,下面案例可供参考
一、程序体会
我是基于HSV转换取到大概率车牌的位置,然后高斯去噪,灰度处理,Sobel算法边缘检测(x方向检测,x方向结果较好),自适应阈值二值化处理,进行膨胀腐蚀,中值滤波去除噪点。不过HSV的mask图设置的为蓝色的阙值,只能识别蓝色车牌,如果要识别的绿色或黄色的车牌要换阙值.
形态学运算最好先为CLOSE运算,填充字块连在一起,效果不好可以调整核的大小以及迭代次数。花的最长时间在形态学的调试,要尝试不同的膨胀腐蚀的结果,达到最佳,才能定位好车牌。最后车牌轮廓检测,要选好提取轮廓的比例和矩形的大小,最好在图片处理前同一固定好图片大小,最后的到的满足条件的矩形作为车牌,最好另保存好图片,这样效果会好一点。
上面只是将车牌定位出来了,我们的目的是识别,但目前还不能直接识别出车牌里面的字符。第一次做法是对字符进行分割,然后再一个字符一个字符的识别。字符分割的方法有很多种,比如直方图切割,我们这里按比例分割:车牌样式是固定的,字符的大小也是固定的,就可以直接根据比例来分割出字符来,但是这样对上一步的要求就比较高,要求切割出来的车牌必须的方方正正的,要不然效果可能不如意。字符识别有OCR框架也有模板匹配,PIL。我选取的OCR框架识别单个字符,但效果非常差,所有最后我采取的方式是对车牌原图高斯去噪,灰度处理然后识别一次OCR得str1,二值化识别一次OCR的str2,最终车牌号为str1(汉字)+A_z(字母)+str2(数字/字母)。
图像处理的步骤有很多种方法,各有优点,大家可以自己去研究。目的就是为了找去我们要的那一块矩形区域。同时,我们用到的卷积核大小,都是自己调的,不一定要按照我这个来。
二、使用步骤
1.系统分析
车牌识别的大体步骤:
获取图片->图像处理->车牌字符分割->字符识别
具体流程图:
2.事前定义函数
# 显示图片
def cv_show(name, img): # 生成窗口显示--opencv读取的格式是BGR
cv2.imshow(name, img)
cv2.waitKey(0)
cv2.destroyAllWindows()
# plt显示彩色图片
def plt_show0(img): # plt.imshow 是以RGB顺序保存
b,g,r = cv2.split(img)
img = cv2.merge([r,g,b])
plt.imshow(img)
plt.show()
# plt显示灰度图
def plt_show(img):
plt.imshow(img, cmap='gray')
plt.show()
def my_cv_imread(filepath): # 解决python中OpenCV库读取图像函数不支持中文路径问题
# 使用imdecode函数进行读取
img = cv2.imdecode(np.fromfile(filepath,dtype=np.uint8),-1)
return img
3.车牌定位
def color_change(picture): # 将图片转化到HSV空间,并按位取反,突出车牌区域
#转化为HSV颜色空间
hsv=cv2.cvtColor(picture,cv2.COLOR_BGR2HSV)
# 函数通过设置不同的h、s、v的min和max阈值可以获取不同色彩的一个二值的mask图
lower_blue=np.array([100,43,46]) #蓝色阈值
upper_blue=np.array([124,255,255])
#构建掩模
mask=cv2.inRange(hsv,lower_blue,upper_blue)
#按位与操作函数
res1=cv2.bitwise_and(image,image,mask=mask)
plt_show0(res1)
# plt_show(res1) 通道数不对
return res1
def Gauss_image(img):# 高斯去噪
image = cv2.GaussianBlur(img, (3, 3), 0) # 高斯矩阵的长与宽都是3,标准差取0
plt_show0(image)
return image
def Gray_image(img): # 灰度处理
gray_image = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
plt_show(gray_image)
return gray_image
def Sobel_x_image(gray_image)