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 相关文章推荐
解决PyCharm控制台输出乱码的问题
Jan 16 Python
Python GUI编程 文本弹窗的实例
Jun 11 Python
pandas的qcut()方法详解
Jul 06 Python
python将字符串list写入excel和txt的实例
Jul 20 Python
python实现比对美团接口返回数据和本地mongo数据是否一致示例
Aug 09 Python
python创建与遍历List二维列表的方法
Aug 16 Python
利用python实现冒泡排序算法实例代码
Dec 01 Python
Python包,__init__.py功能与用法分析
Jan 07 Python
python range实例用法分享
Feb 06 Python
python和node.js生成当前时间戳的示例
Sep 29 Python
selenium携带cookies模拟登陆CSDN的实现
Jan 19 Python
pycharm无法安装cv2模块问题
May 20 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
使用XDebug调试及单元测试覆盖率分析
2011/01/27 PHP
php通过正则表达式记取数据来读取xml的方法
2015/03/09 PHP
PHP IDE phpstorm 常用快捷键
2015/05/18 PHP
搭建Vim为自定义的PHP开发工具的一些技巧
2015/12/11 PHP
jQuery下的几个你可能没用过的功能
2010/08/29 Javascript
jQuery :first选择器使用介绍
2013/08/09 Javascript
目前流行的JavaScript库的介绍及对比
2013/09/29 Javascript
JSONObject使用方法详解
2015/12/17 Javascript
实例详解Nodejs 保存 payload 发送过来的文件
2016/01/14 NodeJs
基于Bootstrap的Metronic框架实现页面链接收藏夹功能
2016/08/29 Javascript
用JS动态设置CSS样式常见方法小结(推荐)
2016/11/10 Javascript
使用jQuery的ajax方法向服务器发出get和post请求的方法
2017/01/13 Javascript
BootStrapValidator初使用教程详解
2017/02/10 Javascript
bootstrap多层模态框滚动条消失的问题
2017/07/21 Javascript
详解redux异步操作实践
2018/08/15 Javascript
微信小程序如何获取用户收货地址
2018/11/27 Javascript
详解Bootstrap 学习(一)入门
2019/04/12 Javascript
Python File(文件) 方法整理
2019/02/18 Python
Python中正则表达式的用法总结
2019/02/22 Python
在PYQT5中QscrollArea(滚动条)的使用方法
2019/06/14 Python
Python基础学习之时间转换函数用法详解
2019/06/18 Python
pyqt5移动鼠标显示坐标的方法
2019/06/21 Python
python中栈的原理及实现方法示例
2019/11/27 Python
keras处理欠拟合和过拟合的实例讲解
2020/05/25 Python
Python如何使用27行代码绘制星星图
2020/07/20 Python
彻底解决Python包下载慢问题
2020/11/15 Python
借助HTML5 Canvas API制作一个简单的猜字游戏
2016/03/25 HTML / CSS
canvas绘制太极图的实现示例
2020/04/29 HTML / CSS
俄罗斯三星品牌商店:GalaxyStore
2020/11/04 全球购物
大学生自我评价怎样写好
2013/10/23 职场文书
大一学生的职业生涯规划书范文
2014/01/19 职场文书
《孔子游春》教学反思
2014/02/25 职场文书
综合素质评价个性与发展自我评价
2015/03/06 职场文书
2016年母亲节广告语
2016/01/28 职场文书
SpringBoot SpringEL表达式的使用
2021/07/25 Java/Android
http通过StreamingHttpResponse完成连续的数据传输长链接方式
2022/02/12 Python