Python实现投影法分割图像示例(二)


Posted in Python onJanuary 17, 2020

在上篇博客中,我们已经实现了水平投影和垂直投影图的绘制。接下来,我们可以根据获得的投影数据进行图像的分割,该法用于文本分割较多,所以此处依然以上次的图为例。

先把上次的两幅图搬过来,方便讲解。

Python实现投影法分割图像示例(二)

上面两图分别从垂直和水平方向描述了图像中文本的分布。我们想象一下,将两幅图重叠起来(当然这里比例要调整下),那么我们就能得到四个重叠的白块,而这些白块所处的位置正是原图中文本的位置。所以接下来的任务就是,找出这些白块的坐标,此处白块近似矩形,所以我们要求矩形的四个坐标。

下面看代码。

#根据水平投影值选定行分割点
inline = 1
start = 0
j = 0
for i in range(0,height):
  if inline == 1 and z[i] >= 150 : #从空白区进入文字区
    start = i #记录起始行分割点
    print i
    inline = 0
  elif (i - start > 3) and z[i] < 150 and inline == 0 : #从文字区进入空白区
    inline = 1
    hfg[j][0] = start - 2 #保存行分割位置
    hfg[j][1] = i + 2
    j = j + 1

确定行分割点的原理就是判断每一行的像素点数是否足够。我们可以从水平投影图中看出,白块是有文字的地方(原图是黑字白底,只是画投影图时选用白块黑底),即前面几行,灰度值为0的点的个数N很少,所以当遇到文字区时,N会很大,根据这一点,我们确定进入文字区的坐标(A1,B1)。然后,当从文字区出来时,N又变的很小,我们再记下它的坐标(A1,B2)。同理,我们可以确定列分割点。

incol = 1
  start1 = 0
  j1 = 0
  z1 = hfg[p][0]
  z2 = hfg[p][1]
  for i1 in range(0,width):
    if incol == 1 and v[i1] >= 20 : #从空白区进入文字区
      start1 = i1 #记录起始列分割点
      incol = 0
    elif (i1 - start1 > 3) and v[i1] < 20 and incol == 0 : #从文字区进入空白区
      incol = 1
      lfg[j1][0] = start1 - 2  #保存列分割位置
      lfg[j1][1] = i1 + 2
      l1 = start1 - 2
      l2 = i1 + 2
      j1 = j1 + 1

最后根据矩形的坐标将文本在图中框出来。附上完整代码。

import cv2
import numpy
img = cv2.imread('D:/0.jpg',cv2.COLOR_BGR2GRAY)
height, width = img.shape[:2]
#print height, width
#resized = cv2.resize(img, (2*width,2*height), interpolation=cv2.INTER_CUBIC)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
(_, thresh) = cv2.threshold(gray, 140, 255, cv2.THRESH_BINARY) 
#使文字增长成块
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (2, 2))#形态学处理,定义矩形结构
closed = cv2.erode(thresh, None, iterations = 7)
#cv2.imshow('erode',closed)
height, width = closed.shape[:2]
#print height, width
z = [0]*height
v = [0]*width
hfg = [[0 for col in range(2)] for row in range(height)]
lfg = [[0 for col in range(2)] for row in range(width)]
box = [0,0,0,0]
#水平投影
a = 0
emptyImage1 = numpy.zeros((height, width, 3), numpy.uint8) 
for y in range(0, height):
  for x in range(0, width):
    cp = closed[y,x]
    #if np.any(closed[y,x]):
    if cp == 0:
      a = a + 1
    else :
      continue
  z[y] = a
  #print z[y]
  a = 0
#根据水平投影值选定行分割点
inline = 1
start = 0
j = 0
for i in range(0,height):
  if inline == 1 and z[i] >= 150 : #从空白区进入文字区
    start = i #记录起始行分割点
    #print i
    inline = 0
  elif (i - start > 3) and z[i] < 150 and inline == 0 : #从文字区进入空白区
    inline = 1
    hfg[j][0] = start - 2 #保存行分割位置
    hfg[j][1] = i + 2
    j = j + 1
 
#对每一行垂直投影、分割
a = 0
for p in range(0, j):
  for x in range(0, width):
    for y in range(hfg[p][0], hfg[p][1]):
      cp1 = closed[y,x]
      if cp1 == 0:
        a = a + 1
      else :
        continue
    v[x] = a #保存每一列像素值
    a = 0
  #print width
  #垂直分割点
  incol = 1
  start1 = 0
  j1 = 0
  z1 = hfg[p][0]
  z2 = hfg[p][1]
  for i1 in range(0,width):
    if incol == 1 and v[i1] >= 20 : #从空白区进入文字区
      start1 = i1 #记录起始列分割点
      incol = 0
    elif (i1 - start1 > 3) and v[i1] < 20 and incol == 0 : #从文字区进入空白区
      incol = 1
      lfg[j1][0] = start1 - 2  #保存列分割位置
      lfg[j1][1] = i1 + 2
      l1 = start1 - 2
      l2 = i1 + 2
      j1 = j1 + 1
      cv2.rectangle(img, (l1, z1), (l2, z2), (255,0,0), 2)      
cv2.imshow('result', img)
cv2.waitKey(0)

代码中注释掉的一些代码,有的是我做的一些小变动,有的是观察中间值。大家可自行查看。

最后放上结果图。

Python实现投影法分割图像示例(二)

由于文本的坐标已经有了,还可以把这些文本块截取下来,用一下PIL或者OPENCV就好了,此处就不做了。

以上这篇Python实现投影法分割图像示例(二)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python中while循环语句用法简单实例
May 07 Python
python实现kMeans算法
Dec 21 Python
浅谈Python黑帽子取代netcat
Feb 10 Python
Windows下安装Django框架的方法简明教程
Mar 28 Python
python模块smtplib学习
May 22 Python
Python面向对象之类和对象属性的增删改查操作示例
Dec 14 Python
python使用suds调用webservice接口的方法
Jan 03 Python
对python函数签名的方法详解
Jan 22 Python
Python 实现OpenCV格式和PIL.Image格式互转
Jan 09 Python
python生成13位或16位时间戳以及反向解析时间戳的实例
Mar 03 Python
Python requests.post方法中data与json参数区别详解
Apr 30 Python
Opencv求取连通区域重心实例
Jun 04 Python
Python常用库大全及简要说明
Jan 17 #Python
Python Sphinx使用实例及问题解决
Jan 17 #Python
通过实例了解Python str()和repr()的区别
Jan 17 #Python
python无序链表删除重复项的方法
Jan 17 #Python
Python实现投影法分割图像示例(一)
Jan 17 #Python
np.dot()函数的用法详解
Jan 17 #Python
python使用numpy实现直方图反向投影示例
Jan 17 #Python
You might like
Apache2 httpd.conf 中文版
2006/12/06 PHP
PHP学习笔记 IIS7下安装配置php环境
2012/10/29 PHP
一个简单且很好用的php分页类
2013/10/26 PHP
PHP+iFrame实现页面无需刷新的异步文件上传
2014/09/16 PHP
smarty缓存用法分析
2014/12/16 PHP
Laravel 解决composer相关操作提示php相关异常的问题
2019/10/23 PHP
js限制文本框只能输入数字(正则表达式)
2012/07/15 Javascript
用nodejs写的一个简单项目打包工具
2013/05/11 NodeJs
jquery隐藏标签和显示标签的实例
2013/11/11 Javascript
JS实现在网页中弹出一个输入框的方法
2015/03/03 Javascript
使用console进行性能测试
2015/04/27 Javascript
JavaScript中的Number数字类型学习笔记
2016/05/26 Javascript
微信开发 消息推送实现代码
2016/10/21 Javascript
详解使用grunt完成requirejs的合并压缩和js文件的版本控制
2017/03/02 Javascript
js 获取元素的具体样式信息getcss(实例讲解)
2017/07/05 Javascript
python实现SMTP邮件发送功能
2020/06/16 Python
如何利用python查找电脑文件
2018/04/27 Python
Python高级用法总结
2018/05/26 Python
python人民币小写转大写辅助工具
2018/06/20 Python
Django分页查询并返回jsons数据(中文乱码解决方法)
2018/08/02 Python
解决pycharm运行出错,代码正确结果不显示的问题
2018/11/30 Python
python处理“
2019/06/10 Python
解决python中导入win32com.client出错的问题
2019/07/26 Python
python中的反斜杠问题深入讲解
2019/08/12 Python
Python高级特性之闭包与装饰器实例详解
2019/11/19 Python
利用Python如何实时检测自身内存占用
2020/05/09 Python
德国最大的服装、鞋子和配件在线商店之一:Outfits24
2019/07/23 全球购物
Kiwi.com中国:找到特价机票并发现新目的地
2019/10/27 全球购物
Linux常见面试题
2013/03/18 面试题
通信专业个人自我鉴定
2013/10/21 职场文书
优秀管理者获奖感言
2014/02/17 职场文书
高考备战决心书
2014/03/11 职场文书
新教师培训心得体会
2014/09/02 职场文书
2015年团支部年度工作总结
2015/05/27 职场文书
让人瞬间清醒的句子,句句经典,字字如金
2019/07/08 职场文书
golang 如何通过反射创建新对象
2021/04/28 Golang