目录
2.2.3 从图像中提取对表达和描绘区域形状有意义的图像分量--闭操作
前言
利用OpenCV基础知识实现车牌识别
注:本文会将代码逐条分解,若觉得easy的可直接跳到最后,看如何在自己电脑上运行。
一、思路
OpenCV实现车牌号识别分四个步骤:
(1)找到车牌位置,将车牌从图中分割出来;
(2)将车牌各个字符分割开,单个字符闭合细小连接;
(3)通过模版匹配识别字符;
(4)输出匹配结果。
相比于深度学习,传统图像处理:
优点:不需要大量的数据集去训练模型,通过形态学、边缘检测等操作提取特征
缺点:基于传统图像处理的图像识别代码的泛化性低,图像的角度,明亮不同时,识别效果会非常差。
二、实现
2.1 预处理
2.1.1 导入所需模块
import cv2
from matplotlib import pyplot as plt
import os
import numpy as np
2.1.2 定义显示函数和高斯滤波灰度处理函数
# plt显示彩色图片,cv2与plt的图像通道不同:cv2为[b,g,r];plt为[r, g, b]
def plt_show0(img):
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 gray_guss(image):
image = cv2.GaussianBlur(image, (3, 3), 0)
gray_image = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)
return gray_image
2.2提取车牌位置
2.2.1原图

2.2.2 图像二值化
# 读取待检测图片->传入需要检测的图片路径
origin_image = cv2.imread('car.jpg')
# 复制一张图片,在复制图上进行图像操作,保留原图
image = origin_image.copy()
# 图像去噪灰度处理
gray_image = gray_guss(image)
# x方向上的边缘检测(增强边缘信息)
Sobel_x = cv2.Sobel(gray_image, cv2.CV_16S, 1, 0)
absX = cv2.convertScaleAbs(Sobel_x)
image = absX
# 图像阈值化操作——获得二值化图
ret, image = cv2.threshold(image, 0, 255, cv2.THRESH_OTSU)
# 显示二值化图像
plt_show(image)

2.2.3 从图像中提取对表达和描绘区域形状有意义的图像分量--闭操作
# 形态学(从图像中提取对表达和描绘区域形状有意义的图像分量)——闭操作
kernelX = cv2.getStructuringElement(cv2.MORPH_RECT, (30, 10))
image = cv2.morphologyEx(image, cv2.MORPH_CLOSE, kernelX,iterations = 1)
# 腐蚀(erode)和膨胀(dilate)
kernelX = cv2.getStructuringElement(cv2.MORPH_RECT, (50, 1))
kernelY = cv2.getStructuringElement(cv2.MORPH_RECT, (1, 20))
#x方向进行闭操作(抑制暗细节)
image = cv2.dilate(image, kernelX)
image = cv2.erode(image, kernelX)
#y方向的开操作
image = cv2.erode(image, kernelY)
image = cv2.dilate(image, kernelY)
# 中值滤波(去噪)
image = cv2.medianBlur(image, 21)
# 显示灰度图像
plt_show(image)

2.2.4 获得轮廓并截取图像
contours, hierarchy = cv2.findContours(image, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
for item in contours:
rect = cv2.boundingRect(item)
x = rect[0]
y = rect[1]
weight = rect[2]
height = rect[3]
# 根据轮廓的形状特点,确定车牌的轮廓位置并截取图像
if (weight > (height * 3.5)) and (weight < (height * 6)):
image = origin_image[y:y + height, x:x + weight]
plt_show0(image)

2.2.5 车牌二值化
#车牌字符分割
# 图像去噪灰度处理
gray_image = gray_guss(image)
# 图像阈值化操作——获得二值化图
ret, image = cv2.threshold(gray_image, 0, 255, cv2.THRESH_OTSU)
#膨胀操作,使“苏”字膨胀为一个近似的整体,为分割做准备
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (2, 2))
image = cv2.dilate(image, kerne

本文介绍利用OpenCV基础知识实现车牌识别,包括找到车牌位置、分割车牌字符、模板匹配识别字符及输出结果四个步骤。还对比了传统图像处理与深度学习的优缺点,最后附上完整代码,并提供车牌号识别模板的下载资源。
&spm=1001.2101.3001.5002&articleId=135467744&d=1&t=3&u=fce607712d42448ba4f9c816e9c5c1d6)
2万+

被折叠的 条评论
为什么被折叠?



