matlab实现MSER(最大极值稳定区域)来进行文本定位

一、自然场景文本定位综述  

场景图像中文本占据的范围一般都较小,图像中存在着大范围的非文本区域。因此,场景图像文本定位作为一个独立步骤越来越受到重视。这包括从最先的CD和杂志封面文本定位到智能交通系统中的车牌定位、视频中的字幕提取,再到限制条件少,复杂背景下的场景文本定位。与此同时文本定位算法的鲁棒性越来越高,适用的范围也越来越广泛。文本定位的方式一般可以分为三种,基于连通域的、基于学习的和两者结合的方式。基于连通域的流程一般是首先提取候选文本区域,然后采用先验信息滤除部分非文本区域,最后根据候选文本字符间的关系构造文本词。基于学习的方式关键在于两个方面:一是不同特征提取方法的使用如纹理、小波、笔画等。二是分类器的使用如支持向量机(Support Vector Machine,SVM),AdaBoost等。连通域和学习结合的方式一般在提取阶段采用连通域的方式,但是滤除阶段是通过训练样本学习分类器来实现非文本的滤除。

1. 基于连通域的方式

  连通域分析是在场景文本图像二值化后进行的,所以开始的研究集中在场景文本图像的预处理、增强和二值化上。基于连通域的方式很少需要在多尺度上进行操作,所以运算时间较快,但存在需要大量的先验信息来滤除文本区域的弊端。

2. 基于学习的方式

  基于学习的方式一般流程是先将图像分割成一个个窗口,提取窗口中图像的特征,然后利用一个训练好的分类器来将窗口分成文本和非文本,最后将文本区域连成一个文本行。基于学习的方式,计算量大,一般都在多尺度上处理,而且需要先准备好训练的数据来训练分类器。

3. 连通域和学习结合的方式

  这一方式一般都是分为两个阶段,阶段一是提取候选的连通区域,这个阶段一般采用的是连通域分析的方法。阶段二是文本区域和非文本区域的分类,这一阶段一般是采用分类器的方式实现的。两者结合的方式虽然没有众多的参数设置,但还是无法摆脱训练数据的限制。

二、利用MSER来进行文本区域定位

  最大极值稳定区域是由Matas等人提出的一种仿射特征区域提取算法。其提取的区域内部灰度几乎不变但是和背景的对比十分强烈,并且该区域能够在多重阈值下保持形状不变。一般文本内部的灰度变化都比较小,而文本和背景的灰度对比度则比较大,符合最大极值稳定区域的特性,因此利用这一特性可以提取颜色聚类无法得到的部分连通域。

最大极值稳定区域先将图像转换成灰度图像,然后在一定的阈值下将图像转换成一系列的二值图像。随着亮度阈值的增加或者减少,区域不断的出现、生长和合并。两个不同阈值间的区域变化不超过一定阈值就能够被认为是稳定的。最大极值稳定区域的数学定义:定义图像 为区域 到灰度 的映射 ,其中 满足全序结构。定义像素间的邻接关系 。则图像中的区域 可定义为图像上满足邻接关系的连通子集,即对于任意点 ,有下式成立

                  (3.6)

其中 。定义的 边界

                  (3.7)

对于 ,有 成立,则称 为极大值区域,反之为极小值区域。对于一组相互嵌套的极值区域 。如果其面积变化率

                    (3.8)

处取得局部最小值,则称 为最大极值稳定区域。

在得到极值稳定区域后,通过将稳定区域赋值为1,将其余区域赋值为0就能够得到最大极值稳定区域的二值化模板。对二值化模板进行连通域分析,就得到了候选的连通域了。

三、利用matlab的detectMSERFeature来实现简单文本定位

1.处理流程

              

  首先是输入一幅图像,想进行必要的预处理如灰度化,然后提取MSER区域(这里直接利用的是matlab自带的函数detectMSERFeature),然后将得到的区域转换成二值图像(主要是利用取得区域的坐标信息)。对得到的MSER区域二值图像进行连通域分析,先粗过滤一些明显不符合字符的区域,然后对过滤后的图像进行闭运算。闭运算之后再进行一次细滤除,最后得到包围文本区域的包围盒。先看几组效果,左边是原图,右边是定位后的图,绿色线画出来的区域,不是很明显。图是比较简单,说明这个方法还是比较初级的,存在比较多的经验阈值。

2、源代码

代码还是比较重要的,说了这么多,能运行出来的代码才是重点,不过只支持matlab2014及以上。

  整个主函数

%% 读取图片
[filename,pathname]=uigetfile(‘*.*‘,‘choose a picture‘);
path = [pathname filename];
colorImage = imread(path);
figure;imshow(colorImage);
%% mser区域提取
grayImage = rgb2gray(colorImage);
mserRegions = detectMSERFeatures(grayImage);
mserRegionsPixels = vertcat(cell2mat(mserRegions.PixelList));

%%  把mser区域的坐标系数取出来,然后将相应系数的地方赋值为真。取出mser区域。
mserMask = false(size(grayImage));
ind = sub2ind(size(mserMask), mserRegionsPixels(:,2), mserRegionsPixels(:,1));
mserMask(ind) = true;
figure;imshow(mserMask);

%% 粗滤除
[p_image,cwidth] =conComp_analysis(mserMask);
figure;imshow(colorImage);
wi= median(cwidth(:))/2;
se1=strel(‘line‘,wi,0);
p_image_dilate= imclose(p_image,se1);

%% 细滤除
[rec_word,img_color,img_bw]=f_conComp_analysis(p_image_dilate,colorImage,p_image);

  其中的conComp_analysis函数,函数返回的是滤除掉非文本的二值图像和用于闭运算的候选值。这个函数主要是对输入的mserMask进行连通域分析,然后根据连通域的大小和高宽比,过滤掉一些非文本区域。同时为了避免太多阈值设定和自适应,将每个连通区域的宽记录在cwidth当中。

function [p_image,cwidth] =conComp_analysis(bwimg)

[x,y]=size(bwimg);
cwidth=[];
whole=x*y;
connComp = bwconncomp(bwimg); % Find connected components
threefeature = regionprops(connComp,‘Area‘,‘BoundingBox‘,‘Centroid‘  );
broder=[threefeature.BoundingBox];%[x y width height]字符的区域
area=[threefeature.Area];%区域面积
centre=[threefeature.Centroid];
%%
for i=1:connComp.NumObjects
    leftx=broder((i-1)*4+1);
    lefty=broder((i-1)*4+2);
    width=broder((i-1)*4+3);
    height=broder((i-1)*4+4);
    cenx=floor(centre((i-1)*2+1));
    ceny=floor(centre((i-1)*2+2));

    if area(i)<80||area(i)>0.3*whole
      bwimg(connComp.PixelIdxList{i})=0;
    elseif width/height<0.1||width/height>2
      bwimg(connComp.PixelIdxList{i})=0;
    else
      cwidth=[cwidth,width];
      rectangle(‘Position‘,[leftx,lefty,width,height], ‘EdgeColor‘,‘g‘);
    end
end
p_image=bwimg;

  其中的f_conComp_analysis,这个函数就不细讲了,跟上面的类似。同时保存了彩色和灰度的文本词图像,为识别做进一步准备。

function [rec,seg_img_color,seg_img_bw] =f_conComp_analysis(P_image,colorImg,p_img)
[x,y]=size(P_image);
whole=x*y;
j=1;
rec=[];
connComp = bwconncomp(P_image); % Find connected components
threefeature = regionprops(connComp,‘Area‘,‘BoundingBox‘);
broder=[threefeature.BoundingBox];%[x y width height]字符的区域
area=[threefeature.Area];%区域面积
%%
for i=1:connComp.NumObjects
    leftx=floor(broder((i-1)*4+1));
    lefty=floor(broder((i-1)*4+2));
    width=broder((i-1)*4+3);
    height=broder((i-1)*4+4);

    %    data=grayimg_reserve(lefty:lefty+height-1,leftx:leftx+width-1);
    %    stda(i,:)=statxture(data);
    if area(i)<500||area(i)>whole*0.4
        P_image(connComp.PixelIdxList{i})=0;
    elseif width/height<2
        P_image(connComp.PixelIdxList{i})=0;
        %     elseif stda(i,4)<0
        %     P_image(connComp.PixelIdxList{i})=0;
    else
        rect=[leftx,lefty,width,height];
        rec=[rec;rect];
        rectangle(‘Position‘,[leftx,lefty,width,height], ‘EdgeColor‘,‘g‘);
        seg_img_color{j}=colorImg(lefty+1:lefty+height,leftx+1:leftx+width,:); % +1 避免索引为0
        seg_img_bw{j}=p_img(lefty+1:lefty+height,leftx+1:leftx+width);
        j=j+1;
        %         zone{1,j}.data=grayimg_reserve(lefty:lefty+height-1,leftx:leftx+width-1);
        %         zone{1,j}.location=[leftx,lefty,width,height];
        %         zone{1,j}.label=j;
        %         j=j+1;
    end
end
pp_image=P_image;
时间: 2024-10-19 07:19:08

matlab实现MSER(最大极值稳定区域)来进行文本定位的相关文章

Matlab mser(最大极值稳定区域)

在Matlab R2013a 和R2014a中已经实现MSER特征的提取. 一.函数detectMSERFeatures 输入的是M*N的灰度图片.可以指定阈值刻度,区域范围,感兴趣区域等参数. 输出的是MSERRegions class,即框住区域的椭圆由椭圆中心的坐标,椭圆的长短轴,椭圆的方向(有长轴与x方向形成的角),即区域内所有像素的坐标. Detect MSER features and return MSERRegions object Syntax · regions = dete

SIFT算法的Matlab实现

个人博客原文:http://www.sun11.me/blog/2016/sift-implementation-in-matlab/ 这是一次作业,内容是给出两张图像,检测特征点和匹配特征点.要求不能用诸如OpenCV的现成特征点检测函数.于是就只能造轮子了,写了这个Matlab版的sift.(其实就是把c语言的opensift翻译成了matlab 以下是算法流程,其实网上的类似博文已经很多了,只不过我看的过程中也看得不很明白,只能对照着好几个看,所以干脆自己又写了一遍.下面的图均来自于参考资

MATLAB函数表(转自:http://bbs.06climate.com/forum.php?mod=viewthread&amp;tid=16041&amp;extra=page%3D4)

MATLAB函数表 4.1.1特殊变量与常数 ans 计算结果的变量名 computer 确定运行的计算机 eps 浮点相对精度 Inf 无穷大 I 虚数单位 inputname 输入参数名 NaN 非数 nargin 输入参数个数 nargout 输出参数的数目 pi 圆周率 nargoutchk 有效的输出参数数目 realmax 最大正浮点数 realmin 最小正浮点数 varargin 实际输入 的参量 varargout 实际返回的参量     4.1.2操作符与特殊字符 + 加 -

Libsvm在matlab环境下使用指南

一.安装 http://www.csie.ntu.edu.tw/~cjlin/libsvm/matlab/.在这个地址上可以下的包含matlab接口的源程序.下载完后可以放到放到任意的盘上解压,最好建一个专门来放matlab程序的文件夹.打开matlab,在matlab的面板上找到set path选项(不同版本不一样R2010b在file菜单下),将刚下载的libsvm整个目录都添加到matlab的搜索路径里.然后将当前路径定位到libsvm/matlab目录下(在current floder(

《OpenCV图像处理编程实例》 目录

当当网购买地址:http://product.dangdang.com/23956649.html京东网购买地址:http://item.jd.com/11929148.html 内容简介 本书以 OpenCV 开源库为基础实现图像处理领域的很多通用算法,并结合当今图像处理领域前沿技术,对多个典型工程实例进行讲解及实现.全书内容覆盖面广,由基础到进阶,各个技术点均提供详细的代码实现,以帮助读者快速上手和深入学习.本书内容共三个部分,其中 1-2 章为基础篇, 3-6 章为进阶篇, 7-9 章为高

在vs环境中跑动sift特征提取(原理部分)

/* 如果给两张图片,中间有相似点.要求做匹配.怎么做.我现在能讲么? 比如给了两幅图片,先求出sift点. 尺度空间极值检测.高斯模糊 关键点定位 关键点方向确定 关键点描述 kdtree 和 bbf 最优节点优先算法 进行两幅图片特征点的匹配,会涵盖一些不正确的匹配点 ransac 随机抽样一致,消除不合适的点 把需要匹配的点,限定到某一个正确的地方 根据这种匹配的结果.确定两幅图相交的某一个点. 比如两幅图的重叠方式是,左上右下的方式,那么在不重叠的地方,按照左边图像写入,然后全黑. 重叠

基于本地文字提取有效定位和识别场景中的文字

一种无约束的端到端的文本定位和识别方法.首先用一个基于区域的方法对文本区域检测,然后更新文本区域用更加健壮(迭代)的方法.并且介绍一种基于笔画的方法,该方法有效的应对字符的大小变化, 旋转,即使只捕捉到文字的小片段. 场景识别又被称为是图片OCR.现在的滑窗技术的一个缺点是:窗口数会随着文本的不同大小旋转方向等因素急速增长.而基于连通域的方法对于一个连通域是一个单独字符还是一个字符的一部分处理的不好,而且对于若干字符粘连不可行.本文提出一种基于方法,受启发于:任意的字符都是有一些笔画组成.因此,

C++实现MATLAB一维数组函数findpeaks()函数求一维离散值极值(波峰波谷)

一.代码 #include <iostream> #include <vector> using namespace std; // //C++实现求一维离散数据极值(波峰.波谷) // //参数:数组,数组大小 void findPeaks(int *num,int count) { vector<int> sign; for(int i = 1;i<count;i++) { /*相邻值做差: *小于0,赋-1 *大于0,赋1 *等于0,赋0 */ int di

MATLAB学习笔记(七)&mdash;&mdash;MATLAB解方程与函数极值

(一)线性方程组求解 包含n个未知数,由n个方程构成的线性方程组为: 其矩阵表示形式为: 其中 一.直接求解法 1.左除法 x=A\b; 如果A是奇异的,或者接近奇异的.MATLAB会发出警告信息的. 2.利用矩阵的分解来求解线性方程组(比单单进行左除速度快) (1)LU分解 LU分解就是分解成一个交换下三角矩阵(也就是说进行一定的操作后才是下三角矩阵)和一个上三角矩阵(不需要变换)的乘积形式.只要A是非奇异的,就可以进行LU分解. MATLAB提供的LU分解函数对于矩阵进行LU分解: [L,U