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

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

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

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

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

    incol = 1start1 = 0j1 = 0z1 = hfg[p][0]z2 = hfg[p][1]for i1 in range(0,width):if incol == 1 and v[i1] >= 20 :  #从空白区进入文字区start1 = i1  #记录起始列分割点incol = 0elif (i1 - start1 > 3) and v[i1] < 20 and incol == 0 :  #从文字区进入空白区incol = 1lfg[j1][0] = start1 - 2   #保存列分割位置lfg[j1][1] = i1 + 2l1 = start1 - 2l2 = i1 + 2j1 = 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 + 1else :continuez[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 iinline = 0elif (i - start > 3) and z[i] < 150 and inline == 0 :  #从文字区进入空白区inline = 1hfg[j][0] = start - 2  #保存行分割位置hfg[j][1] = i + 2j = 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 + 1else :continuev[x] = a  #保存每一列像素值a = 0#print width#垂直分割点incol = 1start1 = 0j1 = 0z1 = hfg[p][0]z2 = hfg[p][1]for i1 in range(0,width):if incol == 1 and v[i1] >= 20 :  #从空白区进入文字区start1 = i1  #记录起始列分割点incol = 0elif (i1 - start1 > 3) and v[i1] < 20 and incol == 0 :  #从文字区进入空白区incol = 1lfg[j1][0] = start1 - 2   #保存列分割位置lfg[j1][1] = i1 + 2l1 = start1 - 2l2 = i1 + 2j1 = j1 + 1cv2.rectangle(img, (l1, z1), (l2, z2), (255,0,0), 2)
cv2.imshow('result', img)
cv2.waitKey(0)

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

最后放上结果图。

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

Python实现投影法分割图像(二)相关推荐

  1. Python实现投影法分割图像(一)

    投影法多用于图像的阈值分割.闲话不多说,现用Python实现.上代码. import cv2 import numpy img = cv2.imread('D:/0.jpg', cv2.COLOR_B ...

  2. python实现图像分割_Python实现投影法分割图像示例(一)

    投影法多用于图像的阈值分割.闲话不多说,现用Python实现. 上代码. import cv2 import numpy img = cv2.imread('D:/0.jpg', cv2.COLOR_ ...

  3. python字符分割垂直投影法_Python实现投影法分割图像示例(一)

    Python实现投影法分割图像示例(一) 发布时间:2020-01-26 21:14 来源:互联网 当前栏目:web技术类 投影法多用于图像的阈值分割.闲话不多说,现用Python实现. 上代码. i ...

  4. 垂直投影法分割验证码

    垂直投影法分割验证码 背景: 在在上一篇的文章中,我们获得了能够破解验证码的完整的步骤的程序,虽然很简单,但是整体的框架已经设计完毕,接下来只要对其中的算法进行改进即可. 老规矩,先附上缺的上一次的链 ...

  5. Halcon对彩色图像进行背景差法分割图像

    Halcon对彩色图像进行背景差法分割图像   *读取背景图像 read_image (BGImage, 'Background.jpg') *依次读取图像 for Index := 1 to 1 b ...

  6. opencv 图像分割 阈值分割 图像二值化 灰度图

    # -*- coding: utf-8 -*- """ @File : 191213_测试_阈值分割.py @Time : 2019/12/13 15:14 @Autho ...

  7. p 分位法实现图像二值化 matlab

    最近在做字符识别,由于对于粘连情况识别无效 ,所以一直在考虑一种能够解决字符粘连的方法,而最为关键的是二值化过程,这种方法不能很好的分割字符,但是也是一种思路,写下来以备以后不时之需.代码很少, cl ...

  8. 【OpenCV 4开发详解】分割图像——分水岭法

    本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4 ...

  9. opencv4 c++ 提取图片中的白色区域_修正!【从零学习OpenCV 4】分割图像——分水岭法...

    点击上方"小白学视觉",选择"星标"公众号重磅干货,第一时间送达 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门书籍<OpenCV 4开 ...

最新文章

  1. 简单比较Python的数据持久化操作
  2. Guice:最好用的依赖注入框架
  3. 你一定需要知道的高阶JAVA枚举特性!
  4. 企业内网中的WSUS更新服务 服务器连接到Microsoft Update来获取更新程序
  5. 机器学习笔记: Discriminative vs Generative Models
  6. Solr相似度算法一:Lucene TF-IDF 相关性算分公式
  7. U9cloud RPA加持 智领未来
  8. spark 写tidb_优秀的数据工程师,怎么用Spark在TiDB上做OLAP分析
  9. vue 多页面多模块分模块打包 分插件安装_Vue渲染方式
  10. GC基本算法及C++GC机制
  11. 数据结构——单链表的C++实现
  12. Python实现本机网络流量监视器
  13. 白光LED驱动方案的选择 TPS61043
  14. UINO优锘:DMV架构管理可视化,让架构图管理快速升级
  15. 【零基础-1】PaddlePaddle学习Bert
  16. 软件测试自学到什么程度可以开始找工作?
  17. 红绿蓝三色阈值,比赛
  18. Auto.js 9版本 OCR 文字识别
  19. git上传代码简单方法 简单git上传代码工具
  20. webStrom2018 版 下载 安装,license server破解 IntelliJ IDEA

热门文章

  1. vue-echarts绘制地图轮廓
  2. 任务清单小功能的实现(任务的增、删、改、查、存储)使用Vue实现
  3. android studio编译app,Android Studio编译项目报错
  4. 2015合肥市第 32 届青少年信息学(计算机)奥林匹克竞赛小学组试题
  5. 浏览器中的js不能同步更新的解决方案
  6. 解决vue项目出现Navigating to current location (XXX) is not allowed 报错
  7. 【Python】matplotlib画图设置标题、轴标签、刻度、刻度标签(系列1)
  8. 阻容降压电路:每个元器件计算选型
  9. 【Zeekr_Tech】为自动驾驶保驾护航—谈谈主流中间件设计
  10. 电子表格文件读写控件Spreadsheet免费下载购买地址