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 修改文件指定行的方法
May 15 Python
在Python的Django框架中显示对象子集的方法
Jul 21 Python
Python解析json文件相关知识学习
Mar 01 Python
python实现list元素按关键字相加减的方法示例
Jun 09 Python
Python日期时间对象转换为字符串的实例
Jun 22 Python
对python当中不在本路径的py文件的引用详解
Dec 15 Python
使用pandas把某一列的字符值转换为数字的实例
Jan 29 Python
Python3.5装饰器原理及应用实例详解
Apr 30 Python
深入浅析Python科学计算库Scipy及安装步骤
Oct 12 Python
python实现删除列表中某个元素的3种方法
Jan 15 Python
Python为何不支持switch语句原理详解
Oct 21 Python
python正则表达式re.match()匹配多个字符方法的实现
Jan 27 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
全国FM电台频率大全 - 9 上海市
2020/03/11 无线电
PHP与SQL注入攻击[二]
2007/04/17 PHP
js 模拟实现类似c#下的hashtable的简单功能代码
2010/01/24 Javascript
jQuery 1.5.1 发布,全面支持IE9 修复大量bug
2011/02/26 Javascript
JavaScript 产生不重复的随机数三种实现思路
2012/12/13 Javascript
网站如何做到完全不需要jQuery也可以满足简单需求
2013/06/27 Javascript
一个Action如何调用两个不同的方法
2014/05/22 Javascript
js简单实现标签云效果实例
2015/08/06 Javascript
九种原生js动画效果
2015/11/11 Javascript
javascript RegExp 使用说明
2016/05/21 Javascript
利用JavaScript判断浏览器类型及版本
2016/08/23 Javascript
原生的强大DOM选择器querySelector介绍
2016/12/21 Javascript
vue中用动态组件实现选项卡切换效果
2017/03/25 Javascript
jquery 一键复制到剪切板的实例
2017/09/20 jQuery
windows下更新npm和node的方法
2017/11/30 Javascript
Vue服务器渲染Nuxt学习笔记
2018/01/31 Javascript
vue最简单的前后端交互示例详解
2018/10/11 Javascript
vue+高德地图写地图选址组件的方法
2019/05/18 Javascript
JavaScript Dom 绑定事件操作实例详解
2019/10/02 Javascript
JS对日期操作封装代码实例
2019/11/08 Javascript
python开发之IDEL(Python GUI)的使用方法图文详解
2015/11/12 Python
全面分析Python的优点和缺点
2018/02/07 Python
详解Python发送email的三种方式
2018/10/18 Python
python实现支付宝转账接口
2019/05/07 Python
python查看文件大小和文件夹内容的方法
2019/07/08 Python
keras 获取某层的输入/输出 tensor 尺寸操作
2020/06/10 Python
python3.4中清屏的处理方法
2020/07/06 Python
python实现磁盘日志清理的示例
2020/11/05 Python
python 实现性别识别
2020/11/21 Python
java关于string最常出现的面试题整理
2021/01/18 Python
欧迪办公美国官网:Office Depot
2016/08/22 全球购物
英国网上超市:Ocado
2020/03/05 全球购物
优秀团员自我评价范文
2014/04/23 职场文书
学生党员公开承诺书
2014/05/28 职场文书
党员干部廉洁承诺书
2014/05/28 职场文书
2014年个人总结范文
2015/03/09 职场文书