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

灰度化

灰度即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()

车牌识别之预处理(灰度化,去噪,二值化,分割)_第1张图片

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()

车牌识别之预处理(灰度化,去噪,二值化,分割)_第2张图片

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()

车牌识别之预处理(灰度化,去噪,二值化,分割)_第3张图片

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()

车牌识别之预处理(灰度化,去噪,二值化,分割)_第4张图片

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

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

车牌识别之预处理(灰度化,去噪,二值化,分割)_第5张图片

字符分隔

字符分隔的三种方法:基于边缘轮廓的字符分隔(常用) 基于投影阀值的字符分隔 基于神经网络聚类的字符分隔
(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()

车牌识别之预处理(灰度化,去噪,二值化,分割)_第6张图片

你可能感兴趣的:(机器学习,机器学习)