参考了网上的一些切割法,稍微优化了下,加了写文字合并的方法,还得改进。有时间再来详细说说流程。

原始图:

切割后如图:

代码如下:(希望能给些建议)

import cv2
import numpy as npclass fontcut():def __init__(self):self.V_PROJECT=1  #垂直self.H_PROJECT=2  #水平#获取文本的投影用于分割字符(垂直,水平)def GetTextProjection(self,src,pos,mode):rows, cols = src.shapeif mode==self.V_PROJECT:print("垂直2", rows, cols)for i in range(rows):for j in range(cols):if src[i,j]>=0 and src[i,j]<=245:pos[j]+=1elif mode == self.H_PROJECT:print("水平2",rows, cols)for i in range(cols):for j in range(rows):if src[j,i]>=0 and src[j,i]<=245:pos[j]+=1return pos# 获取每个分割字符的范围,min_thresh:波峰的最小幅度,min_range:两个波峰的最小间隔def GetPeekRange(self,img,vertical_pos, min_thresh=2,min_range=2, is_check=False):rows, cols = img.shapepeek_range = []begin = -1prev=0for i,value in enumerate(vertical_pos):if value>=min_thresh and begin==-1:begin=ielif value>min_thresh and begin!=-1:continueelif value < min_thresh and begin != -1:end = iif end - begin >= min_range:tmp = {}tmp["begin"] = begintmp["end"] = endpeek_range.append(tmp)begin = -1else:continue#if (i<=rows+2 and i>=rows-2)#print(peek_range)#检测切割后的坐标if is_check:peek_range=self.check_peek(peek_range,rows)peek_range=self.check_small(peek_range,rows)return peek_range#检测切割后的坐标(处理长型图片)def check_peek(self,peeks,height,cut_ratio=1.3):for i,pxy in enumerate(peeks):wd=pxy["end"]-pxy["begin"]pvalue=wd/heightif pvalue>=cut_ratio:print("pvalue", pvalue)# print("pxy",pxy)gustxt=round(pvalue)if gustxt==1:gustxt+=1print("gustxt",gustxt)wdre = wd / gustxtprint("wdre",wdre)k=ipeeks.pop(i)for j in range(gustxt):if (wdre>height+2 or wdre<height-2) and gustxt>2:if j==gustxt-1:begin=int(pxy["begin"] + j * height)npxy = {"begin": begin, "end": pxy["end"]}peeks.insert(k, npxy)else:begin = int(pxy["begin"] + j * height)nend=int(pxy["begin"]+(j+1)*height)npxy={"begin":begin,"end":nend}peeks.insert(k, npxy)else:if j==gustxt-1:begin=int(pxy["begin"] + j * wdre)npxy = {"begin": begin, "end": pxy["end"]}peeks.insert(k, npxy)else:begin = int(pxy["begin"] + j * wdre)nend=int(pxy["begin"]+(j+1)*wdre)npxy={"begin":begin,"end":nend}peeks.insert(k, npxy)k+=1return peeks#检测窄边图片进行合并def check_small(self,peeks,height):for i, pxy in enumerate(peeks):wd = pxy["end"] - pxy["begin"]if wd<height/2+3:#if i < len(peeks) - 1:prev_wd=peeks[i-1]["end"]-peeks[i-1]["begin"]#print("prev_wd",prev_wd,wd,height)#next_wd=peeks[i+1]["end"]-peeks[i+1]["begin"]pz=wd+prev_wd-heightif pz<4 and pz>-4:print("huoqu",wd + prev_wd, height, pz)if pxy["end"]-peeks[i-1]["begin"]<height+2:npxy = {"begin": peeks[i-1]["begin"], "end": pxy["end"]}del peeks[i-1:i+1]peeks.insert(i-1, npxy)return peeks# 切割一行def cut_one_line(self, src, begin, end):rows, cols = src.shapecrop_img = src[begin:end,0:cols]return crop_imgdef save_cut(self,img,id):passdef CutChar(self,img,v_peek_range,pid):rows, cols = img.shapefor id,vpeek in enumerate(v_peek_range):fontxy = (vpeek["begin"],0,vpeek["end"],rows)  # left top right bottom#print("pid",pid,id)crop_img = img[0:rows,vpeek["begin"]:vpeek["end"]]cv2.imwrite("test\\%s%0.3d.png"%(pid,id), crop_img)return 0def CutSingleChar(self,imgpath):img = cv2.imread(imgpath, 0)ret, image = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY+cv2.THRESH_OTSU)rows, cols = image.shapehorizion_pos = [0 for i in range(rows)]pos=self.GetTextProjection(image, horizion_pos, self.H_PROJECT)h_peek_range=self.GetPeekRange(image,pos,10,10)print(h_peek_range)#print(horizion_pos)#将每一文本行切割lines_set=[]for id,peek_range in enumerate(h_peek_range):line = self.cut_one_line(img, peek_range["begin"], peek_range["end"])lines_set.append(line)for id,line in enumerate(lines_set):#if id==0:line_rows, line_cols = line.shapeprint("一行",line_rows, line_cols)vertical_pos=[0 for k in range(line_cols)]pos=self.GetTextProjection(line, vertical_pos, self.V_PROJECT)print("chuizhi",pos)#cv2.imshow("123213{0}".format(id), line)v_peek_range=self.GetPeekRange(line,pos,is_check=True)print(v_peek_range)chars_set_one=self.CutChar(line, v_peek_range,id)cv2.waitKey(0)imgpath='111.png'
mq=fontcut()
mq.CutSingleChar(imgpath)

图片文字切割垂直投影算法相关推荐

  1. iOS UIButton 图片文字上下垂直布局 解决方案

    iOS UIButton 图片文字上下垂直布局 解决方案 参考文章: (1)iOS UIButton 图片文字上下垂直布局 解决方案 (2)https://www.cnblogs.com/yajunL ...

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

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

  3. keras-文本图片文字识别

    1. Keras环境安装 ##参考Keras安装点击打开链接 2. 文本图片素材-文字切割并保存切割图片 # -*- coding: UTF-8 -*- import cv2 import numpy ...

  4. python切割图片文字_Python+opencv 实现图片文字的分割的方法示例

    Python+opencv 实现图片文字的分割的方法示例 发布时间:2020-08-26 03:28:37 来源:脚本之家 阅读:116 作者:坏小孩90 实现步骤: 1.通过水平投影对图形进行水平分 ...

  5. OpenCV 实现图片的水平投影与垂直投影,并进行行分割

    前言:对于印刷体图片来说,进行水平投影和垂直投影可以很快的进行分割,本文在OpenCV中如何进行水平投影和垂直投影通过代码进行说明. 水平投影:二维图像在y轴上的投影 垂直投影:二维图像在x轴上的投影 ...

  6. OpenCV 分割斜体文字(包括旋转,垂直投影,水平投影,透视变换等)

    一,原图 二,分割成行 三,通过旋转,切割后的效果(无透视变换) 四,通过旋转,透视变换,切割后的效果 五,源代码, //初始化透视变换全局变量 Mat warpMatrix;//计算透视变换矩阵 v ...

  7. Python 对图片做垂直投影

    Python 对图片做垂直投影 本文利用opencv对图片进行垂直投影,做出垂直投影图,大体思路:打开图片,灰度化,二值化,按列进行统计,新建一个大小和原图一样的图片,按列进行填充: cv2.cv.G ...

  8. 以牌照搜题为例,简单分析文字切割与识别部分

    转载来自两篇文章:拍照怎么搜题?(上)和拍照怎么搜题?(下) 注:这里讨论分析的仅仅是简单的思路部分,针对特定场景.自然场景下的文本区域检查.切割.识别与这里讨论的内容有一定差别. ######### ...

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

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

最新文章

  1. G - MPI Maelstrom POJ - 1502
  2. IQueryable和IQueryProvider初尝
  3. django和flask用MD5加密密码
  4. IOS研究之App转让流程须知具体介绍
  5. QueryRunner使用
  6. 用c++写的一个词典工具
  7. java 程序打包成jar_Java程序打包成jar包
  8. 后端分页神器,mybatis pagehelper 在SSM与springboot项目中的使用
  9. scipy求极值代码
  10. casue usb kb 找不到驱动程序_手把手教你安装喷墨打印机驱动程序
  11. 尚硅谷redis6文档,代码
  12. 传输线变压器设计原理
  13. WARN: Establishing SSL connection without server‘s identity verification is not recommended 的解决方法
  14. c++控制台游戏-小镇物语正式版 V1.7.2 [可存档!!!]
  15. 移植MyEclipsenbsp;Web项目到Ecli…
  16. (WIP)Start my first kernel journey (by quqi99)
  17. 2020最新手机百度云不限速教程,下载速度10M/S,比会员还快
  18. 7.动态绘制(Jig)
  19. The Graveyard Book
  20. 4g网络什么时候淘汰_4G网络即将被淘汰?4G手机:我还没过时

热门文章

  1. SSM实现排课管理系统
  2. QQ农场之新图鉴大国重器
  3. 怎么能不让别人查看html源码,如何获取被禁止查看的网页源代码,如何禁止别人查看网页源代码...
  4. 该书的bug表Errata for Hands-On Machine Learning with Scikit-Learn and TensorFlow
  5. 你不知道的JavaScript(ES6与之未来)
  6. linux系统下载不了酷狗,在Ubuntu9.10下安装‘酷狗’成功后,打开‘酷狗’遇到问题?...
  7. 可以连接手机,实现更多功能,这款智能头盔你用过吗?
  8. esp32 micropython 蓝牙通信测试程序
  9. 无人机软件供应商DroneDeploy获B轮融资,欲染指机器人平台?
  10. image 转换 pdf