车牌识别之预处理(灰度化,去噪,二值化,分割)

灰度化

灰度即R=G=B 二值化只取255 0
对图片进行灰度化处理,目的是 1 减少数据量 (减少不明显) 2 为二值化准备
对数据进行灰度发现数据量减少并不明显 尤其是 最大 和 平均 灰度法 权重法数据量减少明显 但是权重不容易处理(权重需要自己去调整到自己想要的)

python 二值化代码

1. 使用cv2方法(注意cv2读取图片是BGR通道,保存的图片时单通道)

def gray_cv(img):
    img2 = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)  # 图片灰度化,使用BGR转换灰度。效果稍微好点
    plt.imshow(img2)
    plt.show()
    cv2.imwrite("gray_cv", img2)
    img3 = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)  # RGB转换为灰度
    plt.imshow(img3)
    plt.show()

在这里插入图片描述

2. 最大值二值化(全三个通道中最大的值 R=B=G=max)

def gray_max(img):
    gray_max_rgb_image = img.copy()  # 复制图像,用于后面保存灰度化后的图像bgr值矩阵
    img_shape = img.shape  # 返回一位数组(高,宽,3)获得原始图像的长宽以及颜色通道数,一般彩色的颜色通道为3,黑白为1
    for i in range(img_shape[0]):  # 按行读取图片的像素bgr
        for j in range(img_shape[1]):  # 对每一行按照列进行每一个像素格子进行读取
            gray_max_rgb_image[i, j] = max(img[i, j][0], img[i, j][1], img[i, j][2])  # 求max灰度值
    print(gray_max_rgb_image)
    cv2.imwrite("gray_max1.jpg", gray_max_rgb_image)  # 保存图片
    plt.imshow(gray_max_rgb_image)
    plt.show()

在这里插入图片描述

3. 平均值灰度化(求三个通道平均值 R=G=B=avg)

def gray_avg(img):
    gray_avg_rgb_image = img.copy()  # 复制图像,用于后面保存灰度化后的图像bgr值矩阵
    img_shape = img.shape  # 返回一位数组(高,宽,3)获得原始图像的长宽以及颜色通道数,一般彩色的颜色通道为3,黑白为1
    for i in range(img_shape[0]):  # 按行读取图片的像素bgr
        for j in range(img_shape[1]):  # 对每一行按照列进行每一个像素格子进行读取
            gray_avg_rgb_image[i, j] = (int(img[i,j][0])+int(img[i,j][1])+int(img[i,j][2]))/3 # 求平均灰度值
    print(gray_avg_rgb_image)
    cv2.imwrite("gray_avg1.jpg", gray_avg_rgb_image)
    plt.imshow(gray_avg_rgb_image)
    plt.show()

在这里插入图片描述

4. 权重法平均值(跟选取权重有关,权重不一定通用)

def gray_weight(img):   # 参数没有调好,不好调,图像大小减小多
    # wr, wg, wb = 0.11, 0.59, 0.11
    wr, wg, wb =  0.299, 0.587, 0.114
    gray_weightmean_rgb_image = img.copy()  # 复制图像,用于后面保存灰度化后的图像bgr值矩阵
    img_shape = img.shape  # 返回一位数组(高,宽,3)获得原始图像的长宽以及颜色通道数,一般彩色的颜色通道为3,黑白为1
    for i in range(img_shape[0]):  # 按行读取图片的像素bgr
        for j in range(img_shape[1]):  # 对每一行按照列进行每一个像素格子进行读取
            gray_weightmean_rgb_image[i, j] = (int(wr*img[i,j][2])+int(wg*img[i,j][1])+int(wb*img[i,j][0])) / 3  # 求设置RBG不同权重灰度值
    print(gray_weightmean_rgb_image)
    cv2.imwrite("gray_weight1.jpg", gray_weightmean_rgb_image)
    plt.imshow(gray_weightmean_rgb_image)
    plt.show()

在这里插入图片描述

去噪(高斯滤波 双边滤波(避免边缘模糊))推荐视频,讲解去噪

1噪点产生原因:

1 图片获取过程中:由于受传感器材料属性、工作环境、电子元器件和电路结构等影响,会引入各种噪声,如电阻引
起的热噪声、场效应管的沟道热噪声、光子噪声、暗电流噪声、光响应非均匀性噪声。

2 信号传输过程中:由于传输介质和记录设备等的不完善,数字图像在其传输记录过程中往往会受到多种噪声的污染。另外,在图像处理的某些环节当输入的对象并不如预想时也会在结果图像中引入噪声。

2双边滤波(双边滤波器可以很好地减少不需要的噪声,同时保持边缘相当清晰。然而,它是与大多数过滤器相比非常慢。)

def bi_fillter(img):

    time1 = time.time()
    dst1 = cv2.bilateralFilter(src=gray_img, d=0, sigmaColor=15, sigmaSpace=20)
    cv2.imwrite("bi_img.jpg", dst1)  # 图片大小100*50 效果更好。
    plt.imshow(dst1)
    plt.show()
    time2 = time.time()
    print("gray_bi",time2-time1)
    return dst1

在这里插入图片描述

二值化(只有0或255)

全零 是黑色 全255 白色,自己设置一个阀门,把大于阀门数的设为255,否则为0

def erzhihua(img):
    gray_max_rgb_image = bi_img.copy()  # 复制图像,用于后面保存灰度化后的图像bgr值矩阵
    bi_img_shape = bi_img.shape  # 返回一位数组(高,宽,3)获得原始图像的长宽以及颜色通道数,一般彩色的颜色通道为3,黑白为1
    for i in range(bi_img_shape[0]):  # 按行读取图片的像素bgr
        for j in range(bi_img_shape[1]):  # 对每一行按照列进行每一个像素格子进行读取

            rgb_max = max(bi_img[i, j][0], bi_img[i, j][1], bi_img[i, j][2])  # 求最大灰度化的基础进行二值化
            if rgb_max > 76:  #  可以通过调试,查看变量方法,设置阀值
                gray_max_rgb_image[i, j] = 255
            else:
                gray_max_rgb_image[i, j] = 0
    plt.imshow(gray_max_rgb_image)

    return gray_max_rgb_image

在这里插入图片描述

字符分隔

字符分隔的三种方法:基于边缘轮廓的字符分隔(常用) 基于投影阀值的字符分隔 基于神经网络聚类的字符分隔
(1)垂直投影分割法:把二值图像在垂直以及水平方向上进行投影,从而形成了二值统计图像,从而确定字符位置。使用此方法不仅程序设计要求较为简单,而且分割速度快。但是分割方法过于固定,区域多为方形。

(2)聚类分析分割法:把字符通过形态学方式构成连通域,再与已知特征相结合完成字符分割。使用此种方法能够在汉字字符不连通的情况下也能完成分割任务,但是这种方法不仅计算复杂,且效率不高。

(3)轮廓提取分割法:首先需要对二值图像进行边缘检测计算,然后根据字符的边界将字符框选并分割出来,使用此种方法分割出来的字符边缘非常准确,但是与聚类分析的分割方法相似,具有计算量大,计算速度慢的缺点。

垂直投影法:对应车牌变形的效果不太好,而且图片质量越高,投影效果越好

def touyin2(img):

    paintx = np.zeros(img.shape)
    h, w = img.shape[0], img.shape[1]
    a = [0 for i in range(w)]
    for j in range(0, w):  # 遍历一行
        for i in range(0, h):  # 遍历列
            if img[i, j][0] == 0:  # 如果改点为黑点
                a[j] += 1  # 该列的计数器加一计数  相对于计算某列的白像素

    for j in range(0, w):  # 遍历每一列
        for i in range(a[j]):  # 从该列应该变黑的最顶部的点开始向最底部涂黑
            paintx[i, j] = 255  # 涂黑

    plt.imshow(paintx)
    plt.show()

在这里插入图片描述

  • 23
    点赞
  • 73
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
车牌识别图像预处理是指在使用MATLAB语言进行车牌识别之前,对图像进行一系列的处理操作,以提升车牌字符的检测和识别准确度。 首先,图像预处理的第一步是进行图像的灰度化处理。通过使用灰度化算法将彩色图像转换为灰度图像,可以减少处理的计算量,同时保留车牌图像的主要特征。 接下来,我们需要对图像进行二值化处理。通过二值化技术,将图像转换为只包含黑白两色的二值图像,以方便后续的车牌字符分割和识别过程。可以使用大津算法或自适应阈值法来实现二值化处理。 在得到二值图像后,需要对图像进行去噪处理,以消除图像中的噪声干扰。可以使用中值滤波或均值滤波等滤波技术,去除图像中的斑点、椒盐噪声等。 接下来,进行车牌字符分割。可以利用车牌的形状特征,如长宽比、字符间距等,结合二值图像中字符与背景的颜色差异,实现对字符的分割,获得单独的字符图像。 最后,对分割的字符图像进行规范化处理。通过对字符图像进行大小和位置的归一化处理,使得不同样本之间的字符具有相同的大小和位置,便于后续的字符识别。 综上所述,利用MATLAB语言进行车牌识别图像预处理技术主要包括图像灰度化二值化去噪、字符分割和字符图像规范化等步骤。这些预处理技术可以提高车牌字符的检测和识别准确度,为后续的车牌识别算法提供准确的输入。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值