自动车牌识别(ANPR)是一个从图像或视频中检测车牌位置,并利用光学字符识别(OCR)技术识别车牌上文字的过程。该技术广泛应用于视频监控和安全领域。在本文中,我们将一起探讨使用 Python 实现自动车牌识别系统的各个步骤。
用于演示的图像:
!Test1输入图像
你可以从 这里 下载该图像。
步骤 1:导入必要的库
我们将使用 OpenCV、EasyOCR、matplotlib、numpy、random 以及 imutils 库。
Python
CODEBLOCK_76d17bfa
步骤 2:读取图像并应用滤镜
首先,我们读取图像,然后通过图像预处理技术对其进行清洗,例如将其转换为灰度图,然后应用双边滤波以减少噪声。
- plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB)): 将图像从 BGR 格式(OpenCV 默认格式)转换为 RGB 格式,并使用 matplotlib 显示出来。
- gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY): 将原始图像从 BGR 转换为灰度图,以简化后续处理。
- bfilter = cv2.bilateralFilter(gray, 11, 17, 17): 对灰度图应用双边滤波器,在减少噪声的同时保留边缘信息。
Python
CODEBLOCK_e4b58bbf
输出:
!file
步骤 3:边缘检测
Canny 边缘检测算法首先通过平滑处理来减少噪声,然后检测亮度急剧变化的区域,从而识别图像中的边缘。它使用双重阈值来分离强边缘和弱边缘。这个过程突出了重要的边缘,使得分离车牌变得更加容易。
- edged = cv2.Canny(bfilter, 30, 200): 对滤波后的图像应用 Canny 边缘检测算法,根据指定的阈值帮助检测边缘。
- plt.imshow(cv2.cvtColor(edged, cv2.COLOR_BGR2RGB)): 将边缘检测后的图像从 BGR 转换为 RGB 格式,并使用 matplotlib 显示。
Python
CODEBLOCK_2efa2131
输出:
!file
步骤 4:查找轮廓
轮廓是图像中具有相同强度的形状的边界。它们有助于识别物体或将物体从背景中分离出来。**cv2.findContours()** 函数用于检测二值图像中的这些轮廓,这使得定位和分析图像中的特定区域变得更加容易。
- keypoints = cv2.findContours(edged.copy(), cv2.RETRTREE, cv2.CHAINAPPROXSIMPLE): 使用 RETRTREE 检索模式和 CHAINAPPROXSIMPLE 轮廓逼近方法,在边缘检测图像中查找轮廓。
- contours = imutils.grabcontours(keypoints): 使用 imutils.grabcontours() 从 cv2.findContours() 返回的关键点中提取轮廓。
- contours = sorted(contours, key=cv2.contourArea, reverse=True)[:10]: 按面积对轮廓进行降序排序,并选择前 10 个最大的轮廓进行进一步处理。
- approx = cv2.approxPolyDP(contour, 10, True): 遍历排序后的轮廓,并将每个轮廓逼近为精度为 10 像素的多边形。
- if len(approx) == 4: 检查逼近后的轮廓是否有四条边,这表示它是一个四边形,并将其赋值给 location(车牌位置)。
Python
CODEBLOCK_04d9d304