实现车牌自动识别(License Plate Recognition, LPR)是计算机视觉和深度学习领域中的一个常见任务。用Python和OpenCV,结合其他深度学习库,可以建立一个简单的车牌识别系统。以下是一个基于这两者的基本实现思路和示例代码。
环境准备:
bash
pip install opencv-python opencv-python-headless numpy pillow pytesseract
加载和预处理图像:
检测车牌:
提取车牌字符:
字符识别:
以下是一个简单的实现示例:
import cv2
import numpy as np
import pytesseract
# 设置tesseract路径
pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'
def preprocess_image(image):
# 转为灰度图像
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 高斯模糊
blurred = cv2.GaussianBlur(gray, (5, 5), 0)
# 边缘检测
edged = cv2.Canny(blurred, 100, 200)
return edged
def find_license_plate(image):
edged = preprocess_image(image)
# 查找轮廓
contours, _ = cv2.findContours(edged, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
license_plate_candidates = []
for contour in contours:
# 找到矩形框
x, y, w, h = cv2.boundingRect(contour)
aspect_ratio = w / float(h)
if 2 < aspect_ratio < 5: # 车牌的长宽比
license_plate_candidates.append((x, y, w, h))
return license_plate_candidates
def extract_license_plate(image, candidates):
plates = []
for (x, y, w, h) in candidates:
plate = image[y:y+h, x:x+w]
plates.append(plate)
return plates
def recognize_license_plate(plate_image):
# OCR识别
gray_plate = cv2.cvtColor(plate_image, cv2.COLOR_BGR2GRAY)
_, thresh = cv2.threshold(gray_plate, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
custom_config = r'--oem 3 --psm 8' # psm 8 是流行的字符识别配置
text = pytesseract.image_to_string(thresh, config=custom_config)
return text.strip()
# 主流程
def main(image_path):
# 读取图像
image = cv2.imread(image_path)
candidates = find_license_plate(image)
# 提取车牌图像
plates = extract_license_plate(image, candidates)
# 识别每个候选车牌
for plate in plates:
cv2.imshow("License Plate", plate)
number = recognize_license_plate(plate)
print("Detected License Plate Number:", number)
cv2.waitKey(0)
cv2.destroyAllWindows()
# 调用主函数
if __name__ == "__main__":
main('path_to_your_image.jpg')
将彩色图像转换为灰度图像,减少数据维度,便于后续的处理,如边缘检测或特征提取。
import cv2
image = cv2.imread('image.jpg')
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
cv2.imshow('Gray Image', gray_image)
cv2.waitKey(0)
通过各种滤波器减少图像中的噪声,常用的有均值滤波、高斯滤波和中值滤波。
# 高斯模糊
blurred_image = cv2.GaussianBlur(gray_image, (5, 5), 0)
cv2.imshow('Blurred Image', blurred_image)
cv2.waitKey(0)
常用的边缘检测算法有Canny边缘检测,用于提取图像中的边缘信息。
edges = cv2.Canny(blurred_image, 100, 200)
cv2.imshow('Edges', edges)
cv2.waitKey(0)
主要用于图像的结构性分析,包括膨胀、腐蚀、开运算和闭运算,用于去除噪声和填补空隙。
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))
morphed_image = cv2.morphologyEx(edges, cv2.MORPH_CLOSE, kernel)
cv2.imshow('Morphological Operations', morphed_image)
cv2.waitKey(0)
用于改变图像的视角和形状,适用于图像中的特定区域提取和增强。
points1 = np.float32([[100, 100], [200, 100], [100, 200], [200, 200]])
points2 = np.float32([[80, 80], [220, 80], [80, 220], [220, 220]])
matrix = cv2.getPerspectiveTransform(points1, points2)
transformed_image = cv2.warpPerspective(image, matrix, (300, 300))
cv2.imshow('Transformed Image', transformed_image)
cv2.waitKey(0)
结合Python和OpenCV的强大功能,通过简单的算法可以实现车牌的自动识别。根据项目需求,可以逐步优化代码,提高识别率和系统的鲁棒性。