基于连通域字符分割的流程_基于OpenCV及连通域分析进行文本块分割
上一次通过投影的方式进行了文本块分割,但这种方法有很大的局限性,要求分行清晰、不能有字符跨多行、不能倾斜,而且对噪声比较敏感。还是拿上一回的图片,但是我在上面加了一个比较大的字,得出的结果就有问题了:
可以看到,由于右下角大大的“测”字跨了多行,导致水平投影分行时就出错了。
本次换一种方法,基于连通性分析来做。简单讲,就是把图像做一定的膨胀操作,使得同一个字符的不同部分以及相邻字符相互重叠到一起,变成一个整体,然后再通过分析找到每一个独立的块,排除掉噪声,剩下的基本就是符合条件的结果了。
直接上代码,后面再分析:
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方向都做,但系数不同
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);
对每个连通域取外接矩形,得到的最终结果是这样的:
可以看到效果比之前好了很多,比较大的字可以作为独立的文本块被检测出来了。另外即使是同一行的文本块,也会有轻微的上下浮动,不再是绝对按行对齐了。
未经许可严禁转载。
基于连通域字符分割的流程_基于OpenCV及连通域分析进行文本块分割相关推荐
- python opencv 连通域_基于OpenCV及连通域分析进行文本块分割
上一次通过投影的方式进行了文本块分割,但这种方法有很大的局限性,要求分行清晰.不能有字符跨多行.不能倾斜,而且对噪声比较敏感.还是拿上一回的图片,但是我在上面加了一个比较大的字,得出的结果就有问题了: ...
- matlab 连通域分割,基于OpenCV.Net连通域分析进行文本块分割
上一次通过投影的方式进行了文本块分割,(见 https://www.cnblogs.com/BoyTNT/p/11812323.html )但这种方法有很大的局限性,要求分行清晰.不能有字符跨多行.不 ...
- 基于连通域字符分割的流程_基于改进连通域算法的车牌字符分割方法
基于改进连通域算法的车牌字符分割方法 朱亚萍,邱锦山,杨成忠 [摘 要] 摘要:为了解决车牌字符分割中不连通汉字分割.粘连字符分割以及 竖直边框干扰等问题,提出了一种基于改进连通域算法的车牌字符分割方 ...
- 基于连通域字符分割的流程_基于连通域的快速文字图像分割算法
基于连通域的快速文字图像分割算法 林孜阳 ; 穆雪 ; 吴凯锋 ; 严寒 ; 林怡芳 [期刊名称] <计算机光盘软件与应用> [年 ( 卷 ), 期] 2014(000)022 [摘要] ...
- 基于连通域字符分割的流程_基于连通域的版面分割研究
1 Bair d H S. Background structure in document images[ J] . I nternat ional Journal of Pattern Recog ...
- 基于模型的嵌入式开发流程_如何使用基于模型的测试来改善工作流程
基于模型的嵌入式开发流程 Unit testing is not enough – so let's start using model-based testing to improve our wo ...
- 基于python的入侵检测系统毕设_基于时空特征融合的入侵检测系统模型
期刊:COMPUTERS & SECURITY 期刊信息:JCR分区Q1:中科院分区2区:引用因子4.85 摘要: 入侵检测系统可以通过分析网络流量的特征来区分正常流量和攻击流量.近年来,神经 ...
- python基于svm项目+课程设计报告_基于机器学习的脑电病理诊断
是新朋友吗?记得先点蓝字关注我哦- (图片来自于网络) 1 引言 将机器学习方法应用于脑电信号的自动分析,特别是在基于脑电信号的临床诊断领域,因其巨大的应用前景而引起了广泛的兴趣.例如,它是检测和预测 ...
- 基于cnn的短文本分类_基于时频分布和CNN的信号调制识别分类方法
文章来源:IET Radar, Sonar & Navigation, 2018, Vol. 12, Iss. 2, pp. 244-249. 作者:Juan Zhang1, Yong Li2 ...
最新文章
- centos 更换java版本_centos7 更换jdk版本
- MySQL 主从复制原理及搭建
- [安卓] 7、页面跳转和Intent简单用法
- React开发(178):ant design table基础用法
- python中赋值,深拷贝,浅拷贝区别
- 小马哥-Java 微服务实践 - Spring Boot 系列-01Java 微服务实践 - Spring Boot 系列(一)初体验...
- paip.python语法C++语法对比
- 绿色奖学金申请答辩PPT模板
- Java注解:@IntDef 替换 Emum
- Netron - 网络可视化
- Reflection conclusion
- 自定义ViewPager和RecyclerView指示器 Indicator
- 经Jerry为何会失去“编程的十年”(上)
- [Swift]求最大公约数和最小公倍数【用微信查看本文链接可查看到引用图片】
- jrtplib下载地址
- 针对文件流转Base64的操作
- WebSocket与消息推送
- 理解对数——金融问题中的自然对数(以e为底的对数)
- 航模无人机中PWM信号频率浅谈
- 加州大学计算机硕士录取率是多少,加州大学发布2021录取数据,录取率全面下降,UCLA要跌破10%了!...