大家好,我是java1234_小锋老师,最近写了一套基于Python深度学习的车辆车牌识别系统(PyTorch2卷积神经网络CNN+OpenCV4实现)视频教程,持续更新中,计划月底更新完,感谢支持。

视频在线地址:

https://www.bilibili.com/video/BV1BdUnBLE6N/

课程简介:


本课程采用主流的Python技术栈实现,分两套系统讲解,一套是专门讲PyTorch2卷积神经网络CNN训练模型,识别车牌,当然实现过程中还用到OpenCV实现图像格式转换,裁剪,大小缩放等。另外一套是基于前面Django+Vue通用权限系统基础上,加了车辆识别业务模型,Mysql8数据库,Django后端,Vue前端,后端集成训练好的模型,实现车牌识别。

基于Python深度学习的车辆车牌识别系统(PyTorch2卷积神经网络CNN+OpenCV4实现)视频教程 - 图像预处理

首先我们要对提供的车牌图像进行图片预处理,处理目的是得到图像里的车牌具体矩阵位置,方便后面的工序。

我们使用opencv对图像进行处理,我们这边首先要进行图像灰度化;

然后进行均值模糊;

以及通过sobel算子处理,对模糊图像进行边缘检测;

接下来,我们获取HSV色彩空间,因为车牌不是黄色的,就是蓝色的,我们根据颜色来判断车牌;通过mix混合图像,得到车牌矩阵位置;

我们再进行二值化,不是0就是255

最后对二值图像进行闭运算,可以填充可能的断裂并去除小的物体。

新建lprs_main.py。

import os
​
import cv2
import numpy as np
​
# 车牌字符
char_table = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K',
              'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '川', '鄂', '赣', '甘', '贵',
              '桂', '黑', '沪', '冀', '津', '京', '吉', '辽', '鲁', '蒙', '闽', '宁', '青', '琼', '陕', '苏', '晋',
              '皖', '湘', '新', '豫', '渝', '粤', '云', '藏', '浙']
​
​
# 图像预处理
def pre_process(orig_img):
    gray_img = cv2.cvtColor(orig_img, cv2.COLOR_BGR2GRAY)  # BGR色彩空间转换为灰度图像
    cv2.imwrite('process_img/gray_img.jpg', gray_img)  # 保存灰度图
​
    blur_img = cv2.blur(gray_img, (3, 3))  # 对灰度图像进行均值模糊,使用3*3的内核来减少图像噪声
    cv2.imwrite('process_img/blur_img.jpg', blur_img)  # 保存模糊图
​
    # 对模糊图进行sobel算子处理 对模糊图像进行边缘检测处理
    # 参数1, 0表示只计算x方向梯度,不计算y方向梯度
    # ksize=3表示使用3×3的卷积核进行计算
    # cv2.CV_16S表示输出图像的深度为16位有符号整数
    sobel_img = cv2.Sobel(blur_img, cv2.CV_16S, 1, 0, ksize=3)
    sobel_img = cv2.convertScaleAbs(sobel_img)  # 转换为8位图像
    cv2.imwrite('process_img/sobel_img.jpg', sobel_img)  # 保存sobel图
​
    hsv_img = cv2.cvtColor(orig_img, cv2.COLOR_BGR2HSV)  # 获取图像的HSV色彩空间
    h, s, v = hsv_img[:, :, 0], hsv_img[:, :, 1], hsv_img[:, :, 2]
    # 黄色色调区间[26,34],蓝色色调区间:[100,124]
    blue_img = (((h > 26) & (h < 34)) | ((h > 100) & (h < 124))) & (s > 70) & (v > 70)
    blue_img = blue_img.astype('float32')
    cv2.imwrite('process_img/hsv.jpg', blue_img)
​
    mix_img = np.multiply(sobel_img, blue_img)  # 混合图像
    cv2.imwrite('process_img/mix.jpg', mix_img)
​
    mix_img = mix_img.astype(np.uint8)  # 转换为uint8
​
    ret, binary_img = cv2.threshold(mix_img, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)  # 二值化
    cv2.imwrite('process_img/binary.jpg', binary_img)
​
    kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (21, 5))  # 定义一个结构元素 尺寸为21×5
    close_img = cv2.morphologyEx(binary_img, cv2.MORPH_CLOSE, kernel)  # 对二值图像进行闭运算,可以填充可能的断裂并去除小的物体
    cv2.imwrite('process_img/close.jpg', close_img)
​
    return close_img
​
​
def list_all_files(root):
    files = []
    list = os.listdir(root)  # 获取根目录下的所有文件名
    for i in range(len(list)):
        element = os.path.join(root, list[i])  # 获取文件路径
        if os.path.isfile(element):  # 判断是否是文件
            files.append(element)
        elif os.path.isdir(element):  # 递归判断子目录
            files.extend(list_all_files(element))
    return files
​
​
if __name__ == '__main__':
    car_plate_w, car_plate_h = 136, 36  # 车牌宽高
    char_w, char_h = 20, 20  # 字符宽高
    char_model_path = "char.pth"
    test_images_root = 'images/test/'  # 测试图片路径
    files = list_all_files(test_images_root)
    files.sort()
​
    for file in files:
        img = cv2.imread(file)  # 读取图片
        pre_process(img)
Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐