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

发布时间:2020-08-26 03:28:37

来源:脚本之家

阅读:116

作者:坏小孩90

实现步骤:

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)

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

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

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_

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

下面是实现的全部代码:

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切割图片文字_Python+opencv 实现图片文字的分割的方法示例相关推荐

  1. python 设置全局代理_Python中使用socks5设置全局代理的方法示例

    0x01介绍 PySocks使您可以通过SOCKS和HTTP代理服务器发送流量.它是SocksiPy的现代分支,具有错误修复和其他功能. 0x02 安装 λ pip3 install Pysocks ...

  2. python显示竖着的文字_Python+OpenCV竖版古籍文字分割

    在做图片文字分割的时候,常用的方法有两种.一种是投影法,适用于排版工整,字间距行间距比较宽裕的图像:还有一种是用OpenCV的轮廓检测,适用于文字不规则排列的图像. 1. 思路 一开始想偷个懒,直接用 ...

  3. python列表间隔合并_Python使用zip合并相邻列表项的方法示例

    本文实例讲述了Python使用zip合并相邻列表项的方法.分享给大家供大家参考,具体如下: 1>使用zip()函数和iter()函数,来合并相邻的列表项 >>> x [1, 2 ...

  4. python链表怎么定义_Python数据结构之双向链表的定义与使用方法示例

    本文实例讲述了Python数据结构之双向链表的定义与使用方法.分享给大家供大家参考,具体如下: 和单链表类似,只不过是增加了一个指向前面一个元素的指针而已. 示意图: python 实现代码: #!/ ...

  5. python改为中文版_Python实现繁体中文与简体中文相互转换的方法示例

    本文实例讲述了Python实现繁体中文与简体中文相互转换的方法.分享给大家供大家参考,具体如下: 工作中需要将繁体中文转换成简体中文 安装方法 不需要什么安装方法,只需要把这两个文件下载下来,保存到与 ...

  6. python绘制余弦曲线图_Python使用matplotlib绘制正弦和余弦曲线的方法示例

    本文实例讲述了Python使用matplotlib绘制正弦和余弦曲线的方法.分享给大家供大家参考,具体如下: 一 介绍 关键词:绘图库 二 代码 import numpy as np import m ...

  7. Python学习(1)OpenCV读取图片

    Python学习(1)OpenCV读取图片 前言 一. Python准备 二. Python仿真 三. 仿真结果 四. 小结 前言 随着人工智能研究的不断兴起,Python的应用也在不断上升,由于Py ...

  8. python给图片加半透明水印_Python+OpenCV为图片添加中文水印与图片水印

    OpenCV中在图片上输出中文一般有两种解决办法: 一种需要借助FreeType库实现.FreeType库是一个完全免费(开源)的.高质量的且可移植的字体引擎,它提供统一的接口来访问多种字体格式文件. ...

  9. python图片旋转脚本_Python+OpenCV 实现图片无损旋转90°且无黑边

    0. 引言 有如上一张图片,在以往的图像旋转处理中,往往得到如图所示的图片. 然而,在进行一些其他图像处理或者图像展示时,黑边带来了一些不便.本文解决图片旋转后出现黑边的问题,实现了图片尺寸不变的旋转 ...

最新文章

  1. 过滤字符串中的html标签
  2. java二期_Java架构师鲁班二期
  3. Installation error: INSTALL_FAILED_UID_CHANGED 的解决办法
  4. 一步一步学Remoting系列文章
  5. 关于python序列类型的通用操作符_Python—语法基础(3) 序列类型及操作
  6. nRF52832 BLE_DFU空中升级OTA(一)安装软件(SDK14.2.0)
  7. python中int input_关于python:如何接受int和float类型的输入?
  8. 【白皮书分享】2022新职业教育洞察白皮书:“职”成机遇,“育”见未来.pdf...
  9. php定位符,行定位符、单词定界符实例用法(正则表达式字符集1)
  10. spring boot 访问zul页面语言设置
  11. Android发送网络请求(post,get)工具类
  12. 在windows下安装 Ruby on rails 的血泪史
  13. 新颖的自我介绍_三句有创意的自我介绍 简短有创意的自我介绍
  14. 冉宝的每日一题-8月16日回溯法+ 动态规划压缩
  15. 工信部《全国区块链和分布式记账技术标准化技术委员会组建公示》
  16. 佐切的第三天学习分享
  17. 手把手教你Linux内核编译(三天吐血经历)
  18. Python中的numpy.cumsum()
  19. cocos2dx-lua使用UIListView制作二级折叠菜单
  20. endata 电影票房响应数据破解

热门文章

  1. Qt Creator 2.8.1,qt4.8.5 需要含gcc4.4 的mingw
  2. 2008,人力资源软件是否还依然
  3. 最后电话挂的才是爱你的
  4. opencv linux 编译好,linux下编译opencv
  5. php 递归太多报错,php – javascript太多的递归?
  6. mysql workbench安装出错_MYSQL及MySQL WORKBENCH安装过程遇到的问题及处理方法
  7. python提取日志内容_Python正则提取日志内容
  8. CSS高级技巧【学习笔记】
  9. matlab虚拟现实之V-Realm Builder2复制技巧(修改)
  10. java反射最佳实践_Java 反射最佳实践 – 码农网