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

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

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

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

usingSystem;usingSystem.Collections.Generic;usingSystem.IO;usingSystem.Text;usingOpenCvSharp;usingOpenCvSharp.Extensions;usingOpenCvSharp.Utilities;namespaceOpenCvTest

{classProgram

{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,outcontour, 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);

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

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

未经许可严禁转载。

matlab 连通域分割,基于OpenCV.Net连通域分析进行文本块分割相关推荐

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

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

  2. python opencv 连通域_基于OpenCV及连通域分析进行文本块分割

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

  3. MATLAB环境下基于深度学习的JPEG图像去块(Image Deblocking)

    之前主要研究现代信号处理,深度学习嘛,一个大号/深层的,现代的,黑箱的,信号/图像处理器,所以,作为一个研究现代信号处理的,顺便搞些深度学习也是顺理成章的.本文程序运行环境为MATLAB R2018A ...

  4. matlab 趋势分析,科学网—SEN趋势度分析及其MATLAB实现 - 杨建华的博文

    SEN趋势度分析及其MATLAB实现 一.博文概述 1.目的 学习理解SEN趋势度分析方法及其应用,并编写简易的SEN趋势度分析函数 2.时间 2016年12月24日 3.关键词 SEN趋势度分析   ...

  5. OpenCV二值图像连通域分析

    版权声明:本文为博主原创文章,可以随意共享转载,注明来源即可 https://blog.csdn.net/qq_37059483/article/details/78018539 通域分析对于图像处理 ...

  6. OpenCV——二值图像连通域分析

    通域分析对于图像处理后面涉及到模式识别的内容来说是基础 连通区域(Connected Component)一般是指图像中具有相同像素值且位置相邻的前景像素点组成的图像区域(Region,Blob).连 ...

  7. 基于OpenCV的findContours查找图像连通域,并进行排序

    //基于OpenCV,对读入图片查找连通域,并把每个连通域包含的坐标点根据y值从小到大进行排序. #include <opencv2/legacy/legacy.hpp> #include ...

  8. opencv [c++] 连通域分析connectedComponentsWithStats() 和 connectedComponents()

    1. API相关参数介绍: labels :对原始图中的每一个像素都打上标签,背景为0,连通域打上1,2,3...的标签,同一个连通域的像素打上同样的标签.相当与对每一个像素进行了分类(分割) int ...

  9. Matlab实现连通域标记算法求图像连通域

    Matlab实现连通域标记算法求图像连通域 连通域 连通域标记算法 连通域 连通区域(Connected Component)一般是指图像中具有相同像素值且位置相邻的前景像素点组成的图像区域(Regi ...

最新文章

  1. 热榜第四:GitHub开源代码数据集界ImageNet,推出代码搜索挑战赛
  2. vue中如何使用mockjs摸拟接口的各种数据
  3. linux-查找文件夹
  4. ds18b20温度传感器驱动编写
  5. 去除android控件滑动的时候出现的阴影
  6. HDU2203 亲和串【字符串】
  7. 09年网络工程师考试大纲
  8. KITTI数据集简介与使用
  9. C#开根号函数:math.pow()函数
  10. 微信小程序通过点击事件传参(data-)
  11. 【线代】相似矩阵中特征根的求法:特征方程、一般方程为什么求得的特征根含义不同?
  12. 减法器运算电路公式推导
  13. .NET Core 2.0生成图片验证码
  14. 什么是MTTF,MTBF?
  15. Kubernetes安装Ratel
  16. 拓展交流空间,分享开发精彩 | 开发者说·DTalk 鉴赏
  17. 我帮您_学习资源库,给您学不完的精彩
  18. Mega2560串口通信实现
  19. 计算机教学改革模式,计算机专业课程教学改革研究
  20. 后台控制游戏开关_今天购买这些开关游戏

热门文章

  1. CoreIDRAW课总结
  2. 曼哈顿距离和切比雪夫距离
  3. Linux笔记2_Linux图形界面简介
  4. 经典楼房问题(单调栈)
  5. 我说过无数遍了:从来没有一种技术是为灵活组合这个目标而设计的
  6. js快排(JavaScript快速排序算法)- 前端面试
  7. iis用命令行重启其中一个网站
  8. XMl Schema校验
  9. 国际人类基因组单体型图计划
  10. 李飞飞计算机视觉笔记(2)--线性分类器损失函数与最优化