侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

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

Python  /  管理员 发布于 7年前   188

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

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

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

下面看代码。

#根据水平投影值选定行分割点inline = 1start = 0j = 0for 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 cv2import numpyimg = 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, widthz = [0]*heightv = [0]*widthhfg = [[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 = 0emptyImage1 = 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 = 1start = 0j = 0for 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 = 0for 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)

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

最后放上结果图。

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

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


  • 上一条:
    Python标准库itertools的使用方法
    下一条:
    Python常用库大全及简要说明
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 在python语言中Flask框架的学习及简单功能示例(0个评论)
    • 在Python语言中实现GUI全屏倒计时代码示例(0个评论)
    • Python + zipfile库实现zip文件解压自动化脚本示例(0个评论)
    • python爬虫BeautifulSoup快速抓取网站图片(1个评论)
    • vscode 配置 python3开发环境的方法(0个评论)
    • 近期文章
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • PHP 8.4 Alpha 1现已发布!(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2018-04
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2022-01
    • 2023-07
    • 2023-10
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客