Python中OpenCV实现简单车牌字符切割

作者:圈er 时间:2023-09-19 18:53:59 

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

Python中OpenCV实现简单车牌字符切割

1.实现代码


import cv2
import numpy as np
import matplotlib.pyplot as plt
from 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.shape
image1_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 = 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 = 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 =0
image2 = 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.运行结果

Python中OpenCV实现简单车牌字符切割

Python中OpenCV实现简单车牌字符切割

Python中OpenCV实现简单车牌字符切割

Python中OpenCV实现简单车牌字符切割

Python中OpenCV实现简单车牌字符切割

Python中OpenCV实现简单车牌字符切割

Python中OpenCV实现简单车牌字符切割

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

来源:https://www.cnblogs.com/BIXIABUMO/p/12824111.html

标签:OpenCV,车牌,字符,切割
0
投稿

猜你喜欢

  • python 列表、字典和集合的添加和删除操作

    2022-06-03 14:25:30
  • js 模拟实现类似c#下的hashtable的简单功能代码

    2024-04-19 09:44:51
  • xmlhttp中运行getResponseHeader出错,提示:The requested header was not found

    2010-03-27 21:47:00
  • Python控制线程和函数超时处理

    2023-12-18 05:47:48
  • uniapp小视频项目开发之滑动播放视频

    2023-07-02 05:24:36
  • python for循环remove同一个list过程解析

    2023-03-20 22:07:48
  • SqlServer应用之sys.dm_os_waiting_tasks 引发的疑问(上)

    2024-01-12 15:24:51
  • Javascript Closures (1)

    2009-03-18 12:14:00
  • python MysqlDb模块安装及其使用详解

    2024-01-15 15:21:44
  • php广告加载类用法实例

    2023-11-14 14:56:53
  • 如何优雅、安全的关闭MySQL进程

    2024-01-27 06:33:27
  • CSS Position

    2009-05-17 14:27:00
  • Python代码块批量添加Tab缩进的方法

    2022-10-10 16:41:39
  • Linux CentOS Python开发环境搭建教程

    2021-05-17 22:57:18
  • Python Lambda函数使用总结详解

    2022-05-07 11:41:31
  • Python实现方便使用的级联进度信息实例

    2021-04-22 12:31:18
  • Django基于Token的验证使用的实现

    2023-06-14 18:43:54
  • js动态显示当前日期,时间和星期代码

    2007-08-14 12:31:00
  • 解读ASP.NET 5 & MVC6系列教程(9):日志框架

    2023-06-30 06:10:57
  • centos+nginx+uwsgi部署django项目上线

    2023-12-13 03:36:31
  • asp之家 网络编程 m.aspxhome.com