您当前的位置:首页 > IT编程 > python
| C语言 | Java | VB | VC | python | Android | TensorFlow | C++ | oracle | 学术与代码 | cnn卷积神经网络 | gnn | 图像修复 | Keras | 数据集 | Neo4j | 自然语言处理 | 深度学习 | 医学CAD | 医学影像 | 超参数 | pointnet | pytorch | 异常检测 | Transformers | 情感分类 | 知识图谱 |

自学教程:Python中OpenCV实现简单车牌字符切割

51自学网 2021-10-30 22:29:16
  python
这篇教程Python中OpenCV实现简单车牌字符切割写得很实用,希望能帮到您。

在Jupyter Notebook上使用Python+opencv实现如下简单车牌字符切割。关于opencv库的安装可以参考:Python下opencv库的安装过程与一些问题汇总

1.实现代码

import cv2import numpy as npimport matplotlib.pyplot as pltfrom PIL import Image#读取原图片image1=cv2.imread("123456.jpg")cv2.imshow("image1", image1)#灰度化处理image1_1=cv2.cvtColor(image1,cv2.COLOR_BGR2GRAY)cv2.imshow("image1_1", image1_1)#图像反色h,w = image1_1.shapeimage1_2=image1_1.copy()for i in range(h):    for j in range(w):        image1_2[i,j] = 255-image1_2[i,j]cv2.imshow('image1_2', image1_2)#图像二值化ret,image2 = cv2.threshold(image1_2, 100, 255, cv2.THRESH_BINARY)cv2.imshow('image2', image2)#水平投影h1,w1=image2.shape #返回高和宽image3=image2.copy()a = [0 for z in range(0, h1)] #初始化一个长度为w的数组,用于记录每一行的黑点个数 #记录每一行的波峰for j in range(0,h1):      for i in range(0,w1):          if  image3[j,i]==0:             a[j]+=1             image3[j,i]=255            for j in range(0,h1):      for i in range(0,a[j]):           image3[j,i]=0            plt.imshow(image3,cmap=plt.gray())#灰度图正确的表示方法plt.show()cv2.imshow('image3',image3)  #垂直投影h2,w2=image2.shape #返回高和宽image4=image2.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  image4[i,j]==0:  #如果该点为黑点            b[j]+=1  #该列的计数器加一,最后统计出每一列的黑点个数              image4[i,j]=255  #记录完后将其变为白色,相当于擦去原图黑色部分            for j in range(0,w2):      for i in range((h2-b[j]),h2):  #从该列应该变黑的最顶部的点开始向最底部涂黑        image4[i,j]=0   #涂黑        plt.imshow(image4,cmap=plt.gray())plt.show()cv2.imshow('image4',image4) #分割字符Position = []start = 0a_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 = image2[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 =0image2 = cv2.cvtColor(image2, cv2.COLOR_BGR2RGB)#将灰度图转为RGB彩图#根据确定的位置分割字符for m in range(len(Position)):    cv2.rectangle(image2, (Position[m][0],Position[m][1]), (Position[m][2],Position[m][3]), (0, 0, 255), 2)#第一个参数是原图;第二个参数是矩阵的左上点坐标;第三个参数是矩阵的右下点坐标;第四个参数是画线对应的rgb颜色;第五个参数是所画的线的宽度cv2.imshow('rect',image2)cv2.waitKey(0)

2.运行结果

3. 遇到的问题及解决方法

对于二值化后的灰度图,在确定了各个字符坐标后,使用cv2.rectangle()方法画矩形框:cv2.rectangle(image2, (Position[m][0],Position[m][1]), (Position[m][2],Position[m][3]), (0, 255, 0), 2)。其中,第一个参数表示原图,第二个参数表示矩阵的左上点坐标,第三个参数表示矩阵的右下点坐标;第四个参数是画线对应的RGB颜色,第五个参数是画线宽度。在设置RGB颜色时发现矩形框颜色只能显示为黑色和白色,原因是在二值图上画图颜色没有三通道,无法显示彩色图像。

解决方法:将灰度图转换为RGB彩图。代码为image2 = cv2.cvtColor(image2, cv2.COLOR_BGR2RGB)。

到此这篇关于Python中OpenCV实现简单车牌字符切割的文章就介绍到这了,更多相关OpenCV 车牌字符切割内容请搜索51zixue.net以前的文章或继续浏览下面的相关文章希望大家以后多多支持51zixue.net!


Python排序算法之插入排序及其优化方案详解
Python-OpenCV实现图像缺陷检测的实例
万事OK自学网:51自学网_软件自学网_CAD自学网自学excel、自学PS、自学CAD、自学C语言、自学css3实例,是一个通过网络自主学习工作技能的自学平台,网友喜欢的软件自学网站。