悠悠楠杉
网站页面
正文:
车牌识别(License Plate Recognition, LPR)是计算机视觉中的经典应用场景,广泛应用于交通管理、停车场收费等场景。Python结合OpenCV可以高效实现这一功能,其核心流程包括图像预处理、车牌定位、字符分割和字符识别。本文将重点介绍前三个环节的关键技术,并提供可复用的代码示例。
原始图像可能存在光照不均、噪声干扰等问题,预处理的目标是增强车牌区域的对比度,便于后续定位。
首先将彩色图像转为灰度图,并通过直方图均衡化增强对比度:
import cv2
# 读取图像并灰度化
image = cv2.imread('car.jpg')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 直方图均衡化
equalized = cv2.equalizeHist(gray)
使用Canny算法检测边缘,再通过自适应阈值二值化突出车牌轮廓:
# Canny边缘检测
edges = cv2.Canny(equalized, 100, 200)
# 自适应二值化
binary = cv2.adaptiveThreshold(
equalized, 255,
cv2.ADAPTIVE_THRESH_GAUSSIAN_C,
cv2.THRESH_BINARY_INV, 11, 2
)
车牌通常具有矩形轮廓和特定长宽比,可通过轮廓分析筛选候选区域。
# 查找轮廓
contours, _ = cv2.findContours(
binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE
)
# 筛选车牌轮廓(长宽比约3:1)
plate_contours = []
for cnt in contours:
x, y, w, h = cv2.boundingRect(cnt)
aspect_ratio = w / h
if 2.5 < aspect_ratio < 4.5 and 1000 < cv2.contourArea(cnt) < 5000:
plate_contours.append(cnt)
通过闭运算(先膨胀后腐蚀)连接断裂的车牌边缘:
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
closed = cv2.morphologyEx(binary, cv2.MORPH_CLOSE, kernel)
定位车牌后,需将字符分割为单个图像,便于OCR识别。
通过垂直投影找到字符间的空白间隙:
# 垂直投影统计
vertical_projection = np.sum(closed, axis=0)
# 根据波谷切分字符
characters = []
start = 0
for i in range(1, len(vertical_projection)):
if vertical_projection[i] == 0 and vertical_projection[i-1] > 0:
characters.append(closed[:, start:i])
start = i
将分割后的字符调整为统一尺寸(如20×20像素):
resized_chars = []
for char in characters:
resized = cv2.resize(char, (20, 20))
resized_chars.append(resized)
通过上述步骤,我们实现了车牌识别的核心流程。实际应用中还需根据具体场景调整参数,但OpenCV提供的图像处理能力已为这一任务奠定了坚实基础。