机器视觉车牌字符切割(代码片段)

朱不住 朱不住     2022-12-13     428

关键词:

1.实验目的

利用opencv python实现对下图车牌进行字符切割。实验包括:灰度变化、图像反色、转成二值图、水平投影、垂直投影、字符切割和矩形标示等。

2.实验过程

(1)编写代码

代码如下:

import cv2
import numpy as np

dst=cv2.imread("carplate.png")
plate_original = dst.copy()
cv2.imshow("yuantu", dst)

#高斯滤波
img_aussian = cv2.GaussianBlur(dst,(5,5),1)
#中值滤波
dst = cv2.medianBlur(img_aussian,3)


# 灰度化
gray = cv2.cvtColor(dst, cv2.COLOR_BGR2GRAY)
cv2.imshow('gray',gray)

#二值化处理,低于阈值的像素点灰度值置为0;高于阈值的值置为参数3
ret,thresh1 = cv2.threshold(gray,180,255,cv2.THRESH_BINARY)
cv2.imshow('threshold',thresh1)

gray=thresh1.copy()
LICENSE_HIGH,LICENSE_WIDTH=gray.shape

#-------------------------------跳变次数去掉铆钉和边框----------------------------------
times_row = []  #存储哪些行符合跳变次数的阈值
for row in range(LICENSE_HIGH): # 按行检测 白字黑底
    pc = 0
    for col in range(LICENSE_WIDTH):
        if col != LICENSE_WIDTH-1:
            if gray[row][col+1] != gray[row][col]:
                pc = pc + 1
    times_row.append(pc)


#找车牌的下边缘-从下往上扫描
row_end = 0
row_start = 0
for row in range(LICENSE_HIGH-2):
    if times_row[row] <10:
        continue
    elif times_row[row+1] <10:
        continue
    elif times_row[row+2] <10:
        continue
    else:
        row_end = row + 2
print("row_end",row_end)

#找车牌的上边缘-从上往下扫描
i = LICENSE_HIGH-1
row_num = [] #记录row_start可能的位置
while i > 1:
    if times_row[i] < 10:
        i = i - 1
        continue
    elif times_row[i-1] < 10:
        i = i - 1
        continue
    elif times_row[i-2] < 10:
        i = i - 1
        continue
    else:
        row_start = i - 2
        row_num.append(row_start)
        i = i - 1
#确定row_start最终位置
for i in range(len(row_num)):
    if i != len(row_num)-1:
        if abs(row_num[i] - row_num[i+1])>1:
            row_start = row_num[i]
print("row_start",row_start)

times_col = [0]
for col in range(LICENSE_WIDTH):
    pc = 0
    for row in range(LICENSE_HIGH):
        if row != LICENSE_HIGH-1:
            if gray[row,col] != gray[row+1,col]:
                pc = pc + 1
    times_col.append(pc)

# 找车牌的左右边缘-从左到右扫描
col_start = 0
col_end = 0
for col in range(len(times_col)):
    if times_col[col] > 1:
        col_end = col
print('col_end',col_end)

#j = LICENSE_WIDTH-1
#while j >= 0:
#    if times_col[j] > 0:
#        col_start = j
#   j = j-1
col_start=0
print('col_start',col_start)


# 将车牌非字符区域变成纯黑色
for i in range(LICENSE_HIGH):
    if i > row_end or i < row_start:
        gray[i] = 0
for j in range(LICENSE_WIDTH):
    if j < col_start or j > col_end:
        gray[:,j] = 255
#cv2.imshow("res",gray)

#图像反色
h,w = gray.shape#返回图像的(h)高和(w)宽
image4=gray.copy()
for i in range(h):
    for j in range(w):
        image4[i,j] = 255-image4[i,j]
cv2.imshow('pointinvert', image4)


#水平投影
h1,w1=image4.shape #返回高和宽
image5=image4.copy()
a = [0 for z in range(0, h1)] #初始化一个长度为w的数组,用于记录每一行的黑点个数                                                                                                 
#记录每一行的波峰
for j in range(0,h1):  
    for i in range(0,w1):  
        if  image5[j,i]==0: 
            a[j]+=1 
            image5[j,i]=255
            
for j in range(0,h1):  
    for i in range(0,a[j]):   
        image5[j,i]=0    
        
cv2.imshow('hproject',image5)  

#垂直投影
h2,w2=image4.shape #返回高和宽
image6=image4.copy()
b = [0 for z in range(0, w2)]  #b = [0,0,0,0,0,0,0,0,0,0,...,0,0]初始化一个长度为w的数组,用于记录每一列的黑点个数
#记录每一列的波峰
for j in range(0,w2): #遍历一列 
    for i in range(0,h2):  #遍历一行
        if  image6[i,j]==0:  #如果该点为黑点
            b[j]+=1  #该列的计数器加一,最后统计出每一列的黑点个数  
            image6[i,j]=255  #记录完后将其变为白色,相当于擦去原图黑色部分
            
for j in range(0,w2):  
    for i in range((h2-b[j]),h2):  #从该列应该变黑的最顶部的点开始向最底部涂黑
        image6[i,j]=0   #涂黑
        
cv2.imshow('vproject',image6)



#分割字符
Position = []
start = 0
a_Start = []
a_End = []

#根据水平投影获取垂直分割位置
for i in range(len(a)):
    if a[i] > 0 and start ==0:
        a_Start.append(i)
        start = 1
    if a[i] <= 0 and start == 1:
        a_End.append(i)
        start = 0

#分割行,分割之后再进行列分割并保存分割位置
for i in range(len(a_Start)):
    #获取行图像
    cropImg = image4[a_Start[i]:a_End[i],0:w1]
    #对行图像进行垂直投影
    bstart = 0
    bend = 0
    b_Start = 0
    b_End = 0
    for j in range(len(b)):
        if b[j] > 0 and bstart ==0:
            b_Start =j
            bstart = 1
            bend=0
        if b[j] <= 0 and bstart == 1:
            b_End =j
            bstart = 0
            bend=1
        if bend == 1:
            Position.append([b_Start,a_Start[i],b_End,a_End[i]])
            bend =0

image4 = cv2.cvtColor(image4, cv2.COLOR_BGR2RGB)#将灰度图转为RGB彩图


#根据确定的位置分割字符
for m in range(len(Position)):
    if m == 2:
        continue  #去除圆点画框
    cv2.rectangle(image4, (Position[m][0],Position[m][1]), (Position[m][2],Position[m][3]), (0, 0, 255), 2)
        #第一个参数是原图;第二个参数是矩阵的左上点坐标;第三个参数是矩阵的右下点坐标;第四个参数是画线对应的rgb颜色;第五个参数是所画的线的宽度
        
cv2.imshow('rect',image4)

cv2.waitKey(0)
cv2.destroyAllWindows()

3.运行结果

  1. 原图显示

  2. 灰度变化

  3. 阈值分割(二值化)

  4. 图像反色

  5. 水平投影

  6. 垂直投影

  7. 矩形标示

4.问题及解决方法

问题:参考博客https://blog.csdn.net/dongjinkun/article/details/105429239方法对车牌铆钉去除失败

解决:修改阈值后成功,并对除字符以外区域进行描黑,得到一张干净的车牌图像

5.实验总结

  1. 跳变次数法去除车牌边框和铆钉。
  2. 了解车牌切割流程。

opencv+python实现将车牌数字分割为单个的字符图片(代码片段)

文章目录一、实现代码1.图片预处理读取图片处理车牌上的螺丝转灰度二值化闭运算找字符边界绘制边界预处理效果2.切割字符预处理图转灰度计算每一列的黑色和白色数量以及最大值定义找右边界函数切割字符以及保存切割结... 查看详情

python项目演练:使用深度学习自动识别车牌号附源代码(代码片段)

...ythonpytesseract从车牌中提取字符和数字。 OpenCV是一个开源机器学习库,为计算机视觉提供通用基础设施。而Pytesseract是一个Tesseract-OCR引擎,用于读取图像类型并提取图像中存在的信息。 安装OpenCV和Pytesser 查看详情

opencvc++案例实战十《车牌号识别》(代码片段)

OpenCVC++案例实战十《车牌号识别》前言一、车牌检测1.1.图像预处理1.2.轮廓提取1.3.功能效果1.4.功能源码二、字符切割2.1.图像预处理2.2.轮廓提取2.3.功能效果2.4.功能源码三、字符识别3.1.读取文件3.2.字符匹配3.3.功能源码四... 查看详情

车牌识别原理

...别技术是指对摄像机所拍摄的车辆图像或视频序列,经过机器视觉、图像处理和模式识别等算法处理后自动读取车牌号码、车牌类型、车牌颜色等信息的技术,是人工智能技术中重要的分支。它的硬件基础包括触发设备、摄像设... 查看详情

基于svm支持向量机的车牌分割识别算法matlab仿真(代码片段)

...22?type=blog擅长技术:1.无线基带,无线图传,编解码2.机器视觉,图像处理,三维重建3.人工智能,深度学习4.智能控制,智能优化5.其他一、理论基础    车牌识别系统集合了先进的光电、计算机视觉、信号处理、图像处理、模式... 查看详情

基于颜色模型和形态学处理的车牌定位和识别matlab仿真(代码片段)

...心程序三、测试结果一、理论基础    颜色信息提取、车牌区域定位、识别、提取、检测倾斜度、车牌校正、车牌区域2值化、擦除干扰区域、文字分割、模版匹配、结果输出。   近年来,随着交通现代化的发展要求,汽车牌照... 查看详情

车牌识别基于matlabgui字符匹配车牌识别(18省份)含matlab源码1617期(代码片段)

...技术起源于20世纪80年代初期,图像模式识别和计算机视觉在其中起到至关重要的作用。随着计算机技术的迅速普及和进步,80年代中后期,车牌识别系统逐步投入市场并使用,但识别精度和速度都不理想。目前... 查看详情

labviewocr实现车牌识别

...别(理论篇—5)OCR(光学字符识别)是指机器自动从图像中识别文本字符的过程,OCR机器视觉系统可用于对被测件的识别和分类。常见的识别应用包括:药品包装标签识别、IC芯片编码读取、冲压 查看详情

基于pytorch的无需分割字符的车牌识别(代码片段)

传统车牌识别传统的车牌识别需要先检测出车牌,检测出车牌后通过“像素映射”或者“联通区查找”的方法分割出单个的文字,然后单独识别每个文字。传统的车牌识别不仅繁琐,而且切割文字的效果也很难令人满... 查看详情

opencv+python识别车牌和字符分割(代码片段)

本篇文章主要基于python语言和OpenCV库(cv2)进行车牌区域识别和字符分割,开篇之前针对在python中安装opencv的环境这里不做介绍,可以自行安装配置!车牌号检测需要大致分为四个部分:1.车辆图像获取2.... 查看详情

机器视觉边缘检测算子(代码片段)

1.实验目的利用opencvpython实现对下图实现边缘检测算子。2.实验过程(1)在python安装opencv库,pipinstallopencv-python。(2)在python安装Pillow库,pipinstallPillow。同理,安装Numpy库。(3)编写代码代码如下:importcv2importnumpyimportcv2ascvimportnu 查看详情

机器学习笔记-模式识别的应用场景之一简单车牌识别(代码片段)

一、关于模式识别        模式(Pattern)是指具有某种特定性质的感知对象。一般情况下,待观察的事物都具有时空分布信息。模式识别(PatternRecognition)又称为模式分类,指对待观察事物的各种信息... 查看详情

python切割回文字符串(代码片段)

查看详情

python-pytesseract机器视觉(代码片段)

机器视觉 -tesseract(验证码)安装Ubuntusudoapt-getinstalltesseract-ocrWindows下载安装包添加环境变量(Path):搜索环境变量测试终端:tesseractxx.jpg文件名pytesseract 识别成功率取决你的 tessdata的质量自带的质量就很炸,所以基本上没... 查看详情

《ros理论与实践》学习笔记机器视觉处理(代码片段)

《ROS理论与实践》学习笔记(六)机器视觉处理课程内容1.ROS摄像头驱动及数据接口2.摄像头参数标定3.ROS+OpenCV图像处理方法及案例4.ROS+Tensorflow物体识别方法及案例本讲作业1.通过人脸识别方式,发布速度控制指... 查看详情

机器视觉行业实践技巧(代码片段)

...频播放速度更改后保存参考文献与学习路径光源的使用在机器视觉检测时,经常会遇到需要检测反光的物品,例如:金属、铝箔表面、反光膜片、光滑表面的物品等,这类物品都有同样的特点,就是会发出炫光,这样在检测的时... 查看详情

机器视觉行业实践技巧(代码片段)

...频播放速度更改后保存参考文献与学习路径光源的使用在机器视觉检测时,经常会遇到需要检测反光的物品,例如:金属、铝箔表面、反光膜片、光滑表面的物品等,这类物品都有同样的特点,就是会发出炫光,这样在检测的时... 查看详情

机器视觉halcon中图像获取(代码片段)

00.目录文章目录00.目录01.概述02.相机接口2.1USB接口2.2IEEE1394接口2.3CameraLink接口2.4GigE千兆以太网接口2.5CoaXPress接口2.6Nbase-T接口2.7光纤接口03.Halcon图像采集过程3.1打开设备3.2设置相机参数3.3获取图像3.4结束采集图像04.Halcon相机助手0... 查看详情