Python+opencv 实现图片文字的分割的方法示例


Posted in Python onJuly 04, 2019

实现步骤:

1、通过水平投影对图形进行水平分割,获取每一行的图像;

2、通过垂直投影对分割的每一行图像进行垂直分割,最终确定每一个字符的坐标位置,分割出每一个字符;

先简单介绍一下投影法:分别在水平和垂直方向对预处理(二值化)的图像某一种像素进行统计,对于二值化图像非黑即白,我们通过对其中的白点或者黑点进行统计,根据统计结果就可以判断出每一行的上下边界以及每一列的左右边界,从而实现分割的目的。

下面通过Python+opencv来实现该功能

首先来实现水平投影:

import cv2

import numpy as np

 

'''水平投影'''

def getHProjection(image):

 hProjection = np.zeros(image.shape,np.uint8)

 #图像高与宽

 (h,w)=image.shape 

 #长度与图像高度一致的数组

 h_ = [0]*h

 #循环统计每一行白色像素的个数

 for y in range(h):

  for x in range(w):

   if image[y,x] == 255:

    h_[y]+=1

 #绘制水平投影图像

 for y in range(h):

  for x in range(h_[y]):

   hProjection[y,x] = 255

 cv2.imshow('hProjection2',hProjection)

 

 return h_

 

if __name__ == "__main__":

 #读入原始图像

 origineImage = cv2.imread('test.jpg')

 # 图像灰度化 

 #image = cv2.imread('test.jpg',0)

 image = cv2.cvtColor(origineImage,cv2.COLOR_BGR2GRAY)

 cv2.imshow('gray',image)

 # 将图片二值化

 retval, img = cv2.threshold(image,127,255,cv2.THRESH_BINARY_INV)

 cv2.imshow('binary',img)

 #水平投影

 H = getHProjection(img)

Python+opencv 实现图片文字的分割的方法示例

通过上面的水平投影,根据其白色小山峰的起始位置就可以界定出每一行的起始位置,从而把每一行分割出来。

Python+opencv 实现图片文字的分割的方法示例

获得每一行图像之后,可以对其进行垂直投影

def getVProjection(image):

 vProjection = np.zeros(image.shape,np.uint8);

 #图像高与宽

 (h,w) = image.shape

 #长度与图像宽度一致的数组

 w_ = [0]*w

 #循环统计每一列白色像素的个数

 for x in range(w):

  for y in range(h):

   if image[y,x] == 255:

    w_[x]+=1

 #绘制垂直平投影图像

 for x in range(w):

  for y in range(h-w_[x],h):

   vProjection[y,x] = 255

 cv2.imshow('vProjection',vProjection)

 return w_

Python+opencv 实现图片文字的分割的方法示例

通过垂直投影可以获得每一个字符左右的起始位置,这样也就可以获得到每一个字符的具体坐标位置,即一个矩形框的位置。

下面是实现的全部代码:

import cv2

import numpy as np

 

'''水平投影'''

def getHProjection(image):

 hProjection = np.zeros(image.shape,np.uint8)

 #图像高与宽

 (h,w)=image.shape 

 #长度与图像高度一致的数组

 h_ = [0]*h

 #循环统计每一行白色像素的个数

 for y in range(h):

  for x in range(w):

   if image[y,x] == 255:

    h_[y]+=1

 #绘制水平投影图像

 for y in range(h):

  for x in range(h_[y]):

   hProjection[y,x] = 255

 cv2.imshow('hProjection2',hProjection)

 

 return h_

 

def getVProjection(image):

 vProjection = np.zeros(image.shape,np.uint8);

 #图像高与宽

 (h,w) = image.shape

 #长度与图像宽度一致的数组

 w_ = [0]*w

 #循环统计每一列白色像素的个数

 for x in range(w):

  for y in range(h):

   if image[y,x] == 255:

    w_[x]+=1

 #绘制垂直平投影图像

 for x in range(w):

  for y in range(h-w_[x],h):

   vProjection[y,x] = 255

 #cv2.imshow('vProjection',vProjection)

 return w_

 

if __name__ == "__main__":

 #读入原始图像

 origineImage = cv2.imread('test.jpg')

 # 图像灰度化 

 #image = cv2.imread('test.jpg',0)

 image = cv2.cvtColor(origineImage,cv2.COLOR_BGR2GRAY)

 cv2.imshow('gray',image)

 # 将图片二值化

 retval, img = cv2.threshold(image,127,255,cv2.THRESH_BINARY_INV)

 cv2.imshow('binary',img)

 #图像高与宽

 (h,w)=img.shape 

 Position = []

 #水平投影

 H = getHProjection(img)

 

 start = 0

 H_Start = []

 H_End = []

 #根据水平投影获取垂直分割位置

 for i in range(len(H)):

  if H[i] > 0 and start ==0:

   H_Start.append(i)

   start = 1

  if H[i] <= 0 and start == 1:

   H_End.append(i)

   start = 0

 #分割行,分割之后再进行列分割并保存分割位置

 for i in range(len(H_Start)):

  #获取行图像

  cropImg = img[H_Start[i]:H_End[i], 0:w]

  #cv2.imshow('cropImg',cropImg)

  #对行图像进行垂直投影

  W = getVProjection(cropImg)

  Wstart = 0

  Wend = 0

  W_Start = 0

  W_End = 0

  for j in range(len(W)):

   if W[j] > 0 and Wstart ==0:

    W_Start =j

    Wstart = 1

    Wend=0

   if W[j] <= 0 and Wstart == 1:

    W_End =j

    Wstart = 0

    Wend=1

   if Wend == 1:

    Position.append([W_Start,H_Start[i],W_End,H_End[i]])

    Wend =0

 #根据确定的位置分割字符

 for m in range(len(Position)):

  cv2.rectangle(origineImage, (Position[m][0],Position[m][1]), (Position[m][2],Position[m][3]), (0 ,229 ,238), 1)

 cv2.imshow('image',origineImage)

 cv2.waitKey(0)

Python+opencv 实现图片文字的分割的方法示例

从分割的结果上看,基本上实现了图片中文字的分割。但由于中文结构复杂性,对于一些文字的分割并不理想,比如“叶”、“桃”等字会出现过度分割现象;对于有粘连的两个字会出现分割不够的现象,比如上图中的“念想”。不过可以从图像预处理(腐蚀),边界判断阈值的调整等方面进行优化。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python处理中文编码和判断编码示例
Feb 26 Python
Python Web服务器Tornado使用小结
May 06 Python
Python迭代用法实例教程
Sep 08 Python
基于python实现的抓取腾讯视频所有电影的爬虫
Apr 22 Python
python实现趣味图片字符化
Apr 30 Python
python实现五子棋小程序
Jun 18 Python
浅谈Python访问MySQL的正确姿势
Jan 07 Python
Python如何把多个PDF文件合并代码实例
Feb 13 Python
keras中模型训练class_weight,sample_weight区别说明
May 23 Python
Python常用数据分析模块原理解析
Jul 20 Python
Python logging模块原理解析及应用
Aug 13 Python
Django使用django-simple-captcha做验证码的实现示例
Jan 07 Python
pandas 使用均值填充缺失值列的小技巧分享
Jul 04 #Python
Python使用sklearn库实现的各种分类算法简单应用小结
Jul 04 #Python
python3.x+pyqt5实现主窗口状态栏里(嵌入)显示进度条功能
Jul 04 #Python
pandas取出重复数据的方法
Jul 04 #Python
Python使用sklearn实现的各种回归算法示例
Jul 04 #Python
python SQLAlchemy的Mapping与Declarative详解
Jul 04 #Python
pandas分区间,算频率的实例
Jul 04 #Python
You might like
PHP安装攻略:常见问题解答(三)
2006/10/09 PHP
PHP Memcached应用实现代码
2010/02/08 PHP
PHP写的求多项式导数的函数代码
2012/07/04 PHP
PHP闭包(Closure)使用详解
2013/05/02 PHP
比较strtr, str_replace和preg_replace三个函数的效率
2013/06/26 PHP
PHP图形操作之Jpgraph学习笔记
2015/12/25 PHP
jquery不支持toggle()高(新)版本的问题解决
2016/09/24 PHP
Sample script that displays all of the users in a given SQL Server DB
2007/06/16 Javascript
Prototype Object对象 学习
2009/07/12 Javascript
javascript获得网页窗口实际大小的示例代码
2013/09/21 Javascript
appendChild() 或 insertBefore()使用与区别介绍
2013/10/11 Javascript
jquery常用特效方法使用示例
2014/04/25 Javascript
JavaScript中对象属性的添加和删除示例
2014/05/12 Javascript
浅析javascript中function 的 length 属性
2014/05/27 Javascript
JavaScript中的立即执行函数表达式介绍
2015/03/15 Javascript
jQuery实现的仿select功能代码
2015/08/19 Javascript
jQuery插件HighCharts绘制2D圆环图效果示例【附demo源码下载】
2017/03/09 Javascript
AngularJS基于factory创建自定义服务的方法详解
2017/05/25 Javascript
es6中的解构赋值、扩展运算符和rest参数使用详解
2017/09/28 Javascript
animate.css在vue项目中的使用教程
2018/08/05 Javascript
Angular动态绑定样式及改变UI框架样式的方法小结
2018/09/03 Javascript
node+express框架中连接使用mysql(经验总结)
2018/11/10 Javascript
详解vue2.0 资源文件assets和static的区别
2018/11/27 Javascript
JS实现移动端点击按钮复制文本内容
2019/07/28 Javascript
koa-passport实现本地验证的方法示例
2020/02/20 Javascript
Python的print用法示例
2014/02/11 Python
python基础教程之序列详解
2014/08/29 Python
numpy使用fromstring创建矩阵的实例
2018/06/15 Python
python新式类和经典类的区别实例分析
2020/03/23 Python
CSS3 animation实现逐帧动画效果
2016/06/02 HTML / CSS
员工保密协议书
2014/09/27 职场文书
个人四风问题对照检查材料
2014/10/01 职场文书
党员干部三严三实心得体会
2014/10/13 职场文书
群众路线教育实践活动心得体会(教师)
2014/10/31 职场文书
2014年工程师工作总结
2014/11/25 职场文书
Pytest allure 命令行参数的使用
2021/04/18 Python