基于像素阈值的车牌字符分割

目录

(1)实验背景

(2)实验简介

(3)实验素材

(4)实验步骤

(1)实验背景

随着科技的发展,自动车牌识别系统(Automatic License Plate Recognition, ALPR)在交通监控、停车场管理、高速收费等领域得到了广泛应用。车牌字符分割是ALPR系统中的关键步骤之一,其质量直接影响到后续的车牌字符识别的准确性。

车牌字符分割的目标是将车牌图像中的每个字符准确地分割出来,为后续的字符识别提供准确的输入。然而,由于车牌的颜色、字体、大小、照明条件等因素的影响,车牌字符分割是一项具有挑战性的任务。传统的车牌字符分割方法主要基于图像处理技术,如二值化、边缘检测、连通域分析等。然而,这些方法对图像质量、照明条件等因素敏感,容易受到噪声和光照变化的影响,分割效果不尽如人意。

近年来,随着深度学习技术的发展,基于深度学习的车牌字符分割方法逐渐受到关注。这些方法能够自动学习图像中的复杂模式,对噪声和光照变化具有较强的鲁棒性,分割效果显著优于传统方法。

(2)实验简介

本文介绍了一种基于像素阈值的车牌字符分割技术,该技术通过计算每列的黑白像素总和,然后根据设定的阈值对图像进行分割,从而实现车牌字符的准确分割。该技术简单高效,不需要大量的计算资源和内存,适合在资源有限的设备上部署。

(3)实验素材

(4)实验步骤

1、导入实验所需库。

import cv2

2、读取一张名为Car5.jpg的图片(即上述实验素材),将其转换为灰度图像,并在屏幕上显示原始图像和灰度图像。

# 读取图像,并把图像转换为灰度图像并显示
img_ = cv2.imread('Car5.jpg')
cv2.imshow('gray', img_)# 读取图片
img_gray = cv2.cvtColor(img_, cv2.COLOR_BGR2GRAY)  # 转换了灰度化
cv2.imshow('gray1', img_gray)  # 显示图片
cv2.waitKey(0)

程序输出效果如下:

3、将灰度图像二值化,设定阈值是100。

# 将灰度图像二值化,设定阈值是100
ret, img_thre = cv2.threshold(img_gray, 100, 255, cv2.THRESH_BINARY_INV)

4、遍历二值化后的图像的每一列,计算并记录每一列的黑色和白色像素总和,并同时找出最大的黑色和白色像素总和,这些信息将为后续的图像分割提供重要依据。

white = []  # 记录每一列的白色像素总和
black = []  # 记录每一列的黑色像素总和
height = img_thre.shape[0]
width = img_thre.shape[1]
white_max = 0
black_max = 0
# 计算每一列的黑白色像素总和
for i in range(width):
    s = 0  # 这一列白色总数
    t = 0  # 这一列黑色总数
    for j in range(height):
        if img_thre[j][i] == 255:
            s += 1
        if img_thre[j][i] == 0:
            t += 1
    white_max = max(white_max, s)
    black_max = max(black_max, t)
    white.append(s)
    black.append(t)

5、判断图像是否为黑底白字。变量arg被设置为False,表示默认图像为白底黑字。接着,如果最大的黑色像素总和black_max大于最大的白色像素总和white_max,则将arg设置为True,表示图像为黑底白字。

arg = False  # False表示白底黑字;True表示黑底白字
if black_max > white_max:
    arg = True

6、定义了函数find_end,其功能是根据输入的字符开始位置和图像的黑白像素分布,计算并返回字符在图像中的结束位置。

# 分割图像
def find_end(start_):
    end_ = start_ + 1
    for m in range(start_ + 1, width - 1):
        if (black[m] if arg else white[m]) > (0.89 * black_max if arg else 0.89 * white_max):  # 0.95这个参数请多调整,对应下面的0.05(针对像素分布调节)
            end_ = m
            break
    return end_

7、遍历二值化图像的每一列,根据像素的黑白分布找到每个字符的开始和结束位置,然后将每个字符从图像中分割出来,并调整其大小为15x30像素。

n = 1
start = 1
end = 2
word = []
while n < width - 2:
    n += 1
    if (white[n] if arg else black[n]) > (0.11 * white_max if arg else 0.11 * black_max):
        # 上面这些判断用来辨别是白底黑字还是黑底白字
        # 0.05这个参数请多调整,对应上面的0.95
        start = n
        end = find_end(start)
        n = end
        if end - start > 5:
            cj = img_[1:height, start:end]
            cj = cv2.resize(cj, (15, 30))
            word.append(cj)

8、将分割出的每个字符保存为单独的图像文件,同时如需关闭图像窗口,可通过键盘输入来控制图像窗口的关闭,按下'q'键或'Esc'键即关闭所有图像窗口。

k=0
for i,j in enumerate(word):
    picname = './image/%d.jpg' % k
    k+=1
    cv2.imwrite(picname,word[i])

k = cv2.waitKey(20) & 0xFF
if k & 0xFF == ord('q') or k == 27:
    cv2.destroyAllWindows()

9、程序字符分割效果如下:

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值