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中的多进程
Nov 06 Python
zookeeper python接口实例详解
Jan 18 Python
Python2包含中文报错的解决方法
Jul 09 Python
在matplotlib的图中设置中文标签的方法
Dec 13 Python
python绘制直方图和密度图的实例
Jul 08 Python
Python hashlib加密模块常用方法解析
Dec 18 Python
PyTorch中反卷积的用法详解
Dec 30 Python
pytorch:model.train和model.eval用法及区别详解
Feb 20 Python
python爬虫开发之selenium模块详细使用方法与实例全解
Mar 09 Python
Keras 切换后端方式(Theano和TensorFlow)
Jun 19 Python
python 元组和列表的区别
Dec 30 Python
总结python 三种常见的内存泄漏场景
Nov 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
PHP 显示客户端IP与服务器IP的代码
2010/10/12 PHP
php之XML转数组函数的详解
2013/06/07 PHP
PHP使用逆波兰式计算工资的方法
2015/07/29 PHP
Yii框架结合sphinx,Ajax实现搜索分页功能示例
2016/10/18 PHP
PHP微信H5支付开发实例
2018/07/25 PHP
PHP递归的三种常用方式
2019/02/28 PHP
破除网页鼠标右键被禁用的绝招大全
2006/12/27 Javascript
asp.net+js 实现无刷新上传解析csv文件的代码
2010/05/17 Javascript
JSON JQUERY模板实现说明
2010/07/03 Javascript
原生javascript实现简单的datagrid数据表格
2015/01/02 Javascript
jQuery实现的图文高亮滚动切换特效实例
2015/08/10 Javascript
深入浅析react native es6语法
2015/12/09 Javascript
使用node+vue.js实现SPA应用
2016/01/28 Javascript
AngularJS中$http使用的简单介绍
2017/03/17 Javascript
JS中的多态实例详解
2017/10/15 Javascript
node.js将MongoDB数据同步到MySQL的步骤
2017/12/10 Javascript
利用chrome浏览器进行js调试并找出元素绑定的点击事件详解
2021/01/30 Javascript
详解vue几种主动刷新的方法总结
2019/02/19 Javascript
JavaScript一元正号运算符示例代码
2019/06/30 Javascript
p5.js临摹动态图形的方法
2019/10/23 Javascript
在weex中愉快的使用scss的方法步骤
2020/01/02 Javascript
Python去掉字符串中空格的方法
2014/03/11 Python
使用wxpython实现的一个简单图片浏览器实例
2014/07/10 Python
pandas修改DataFrame列名的方法
2018/04/08 Python
python实现屏保计时器的示例代码
2018/08/08 Python
anaconda中更改python版本的方法步骤
2019/07/14 Python
python 自定义装饰器实例详解
2019/07/20 Python
Python lambda表达式原理及用法解析
2020/08/18 Python
python 多线程爬取壁纸网站的示例
2021/02/20 Python
不同浏览器对CSS3和HTML5的支持状况
2009/10/31 HTML / CSS
英国经济型酒店品牌:Travelodge
2019/12/17 全球购物
Silk Therapeutics官网:清洁、抗衰老护肤品
2020/08/12 全球购物
WebSphere 应用服务器都支持哪些认证
2013/12/26 面试题
C#实现对任一张表的数据进行增,删,改,查要求,运用Webservice,体现出三层架构
2014/07/11 面试题
100句拼搏进取的名言警句,值得一读!
2019/10/07 职场文书
opencv用VS2013调试时用Image Watch插件查看图片
2021/07/26 Python