上一次通过投影的方式进行了文本块分割,但这种方法有很大的局限性,要求分行清晰、不能有字符跨多行、不能倾斜,而且对噪声比较敏感。还是拿上一回的图片,但是我在上面加了一个比较大的字,得出的结果就有问题了:

可以看到,由于右下角大大的“测”字跨了多行,导致水平投影分行时就出错了。

本次换一种方法,基于连通性分析来做。简单讲,就是把图像做一定的膨胀操作,使得同一个字符的不同部分以及相邻字符相互重叠到一起,变成一个整体,然后再通过分析找到每一个独立的块,排除掉噪声,剩下的基本就是符合条件的结果了。

直接上代码,后面再分析:using System;

using System.Collections.Generic;

using System.IO;

using System.Text;

using OpenCvSharp;

using OpenCvSharp.Extensions;

using OpenCvSharp.Utilities;

namespace OpenCvTest

{

class Program

{

static void Main(string[] args)

{

//读入源文件

var src = IplImage.FromFile("source.jpg");

//转换到灰度图

var gray = Cv.CreateImage(src.Size, BitDepth.U8, 1);

Cv.CvtColor(src, gray, ColorConversion.BgrToGray);

//做一下膨胀,x与y方向都做,但系数不同

//使用了Erode方法,腐蚀操作,针对白色区域,所以等效于对文字进行了膨胀

var kernal = Cv.CreateStructuringElementEx(5, 2, 1, 1, ElementShape.Rect);

Cv.Erode(gray, gray, kernal, 2);

//二值化

Cv.Threshold(gray, gray, 0, 255, ThresholdType.BinaryInv | ThresholdType.Otsu);

//检测连通域,每一个连通域以一系列的点表示,FindContours方法只能得到第一个域

var storage = Cv.CreateMemStorage();

CvSeq contour = null;

Cv.FindContours(gray, storage, out contour, CvContour.SizeOf, ContourRetrieval.CComp, ContourChain.ApproxSimple);

var color = new CvScalar(0, 0, 255);

//开始遍历

while (contour != null)

{

//得到这个连通区域的外接矩形

var rect = Cv.BoundingRect(contour);

//如果高度不足,或者长宽比太小,认为是无效数据,否则把矩形画到原图上

if(rect.Height > 10 && (rect.Width * 1.0 / rect.Height) > 0.2)

Cv.DrawRect(src, rect, color);

//取下一个连通域

contour = contour.HNext;

}

Cv.ReleaseMemStorage(storage);

//显示

Cv.ShowImage("Result", src);

Cv.WaitKey();

Cv.DestroyAllWindows();

}

}

}

下面来一步一步分析。读入的原图是这样的:

转换到灰度图并膨胀处理后,已经可以大致看出同一文本块的多个字符已经连到一起了:

二值化后的图像:

做连通性分析后,原始分析出的结果是这样的:Cv.DrawContours(src, contour, color, color, 1);

对每个连通域取外接矩形,得到的最终结果是这样的:

可以看到效果比之前好了很多,比较大的字可以作为独立的文本块被检测出来了。另外即使是同一行的文本块,也会有轻微的上下浮动,不再是绝对按行对齐了。

未经许可严禁转载。

python opencv 连通域_基于OpenCV及连通域分析进行文本块分割相关推荐

  1. 基于连通域字符分割的流程_基于OpenCV及连通域分析进行文本块分割

    上一次通过投影的方式进行了文本块分割,但这种方法有很大的局限性,要求分行清晰.不能有字符跨多行.不能倾斜,而且对噪声比较敏感.还是拿上一回的图片,但是我在上面加了一个比较大的字,得出的结果就有问题了: ...

  2. matlab 连通域分割,基于OpenCV.Net连通域分析进行文本块分割

    上一次通过投影的方式进行了文本块分割,(见 https://www.cnblogs.com/BoyTNT/p/11812323.html )但这种方法有很大的局限性,要求分行清晰.不能有字符跨多行.不 ...

  3. opencv三维重建_基于OpenCV和C++的多视图三维重建

    前两张图采用本质矩阵计算RT的方法,然后三角测量计算三维坐标.具体原理可以百度. 后面的增量图采用PnP的方法.通过计算图2图3匹配点和图1图2匹配点的公共部分,而图1和图2已经重建完成了,这些公共部 ...

  4. python画版图_基于mask-RCNN的版图分析,MaskRCNN,版面

    数据集: PubLayNet 训练: code: import os import sys import random import torch import torchvision from tor ...

  5. python实现流媒体传输_基于OpenCV的网络实时视频流传输的实现

    很多小伙伴都不会在家里或者办公室安装网络摄像头或监视摄像头.但是有时,大家又希望能够随时随地观看视频直播. 大多数人会选择使用IP摄像机(Internet协议摄像机)而不是CCTV(闭路电视),因为它 ...

  6. opencv python考勤_基于opencv和dlib人脸识别的员工考勤系统

    已打包生成可执行文件exe,可直接下载运行,exe文件及代码均已上传到我的github,点击传送门,打包的具体过程及教程可见pyinstaller简明教程 WorkAttendanceSystem 一 ...

  7. python读取视频流做人脸识别_基于OpenCV和Keras实现人脸识别系列——二、使用OpenCV通过摄像头捕获实时视频并探测人脸、准备人脸数据...

    基于OpenCV和Keras实现人脸识别系列手记: 项目完整代码参见Github仓库. 本篇是上面这一系列手记的第二篇. 在Opencv初接触,图片的基本操作这篇手记中,我介绍了一些图片的基本操作,而 ...

  8. python运动目标检测与跟踪_基于OpenCV的运动目标检测与跟踪

    尹俊超,刘直芳:基于 OpenCV 的运动目标检测与跟踪 2011, V ol.32, No.8 2817 0 引 言 运动目标检测跟踪技术在航空航天遥感. 生物医学. 工业 自动化生产. 军事公安目 ...

  9. [Python图像处理] 十四.基于OpenCV和像素处理的图像灰度化处理

    该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门.OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子.图像增强技术.图像分割等,后期结合深度学习研究图像识别 ...

最新文章

  1. 基于视觉模型强化学习的通用机器人
  2. python【蓝桥杯vip练习题库】ALGO-82 输出米字形
  3. 基于多种转换语义的图数据库查询
  4. php yii框架和laravel,yii2跟laravel的区别是什么?
  5. SAP UI5应用debug级别的日志打印如何设置
  6. tablemodel dapter区别
  7. iPhone开发之self.的用法
  8. bootstrap 仿实例
  9. 解决从json文件中获取不到数据的问题
  10. Swagger——与WebAPI整合
  11. VS2013各版本密钥
  12. Docker的镜像管理及配置加速器
  13. 条形码在android上的代码,使条码生成器在android
  14. 新数据经济的民主化:科技巨头如何窃取我们的数据以及我们如何夺回控制权
  15. 《围城》读后感:你的心是一座城,愿你城中有幸福
  16. No enclosing instance of type FormDetailBean is accessible. Must qualify the allocation with an encl
  17. 前端实现组织结构列表
  18. cad移动时捕捉不到基点_CAD2012 怎么捕捉不到点了? 对象捕捉也开了。
  19. 如何设计一个PC客户端的架构
  20. C++(面试题):给40亿个不重复的无符号整数,没排过序,如何快速判断一个数是否在这40亿个数中

热门文章

  1. Unix/Linux编程:fork()进程详解
  2. Reactor 3 参考文档
  3. 使用Python玩转WMI
  4. android:java.lang.NoClassDefFoundError: com.lidroid.xutils.HttpUtils 异常的解决
  5. Android 实现国际化
  6. Web即时通信技术 -- 服务器推送技术盘点
  7. 头条音乐号背后逻辑及老年人市场
  8. 思科利用三层交换机实现 VLAN 间路由
  9. java中label是什么_Java中的标签(Label)是什么?
  10. ACPI对接Windows操作系统