Matlab提取文字部分MSER特征并初步分类
2017-05-24 17:00
591 查看
一、介绍MATLAB中detectMSERFeatures函数:
算法—强度阈值级别MSER检测器逐步跨越输入图像的强度范围,以检测稳定区域。该ThresholdDelta参数确定检测器测试稳定性的增量数。您可以将阈值增量值视为杯子的大小,以便用水填充桶。杯子越小,填充桶所需的增量越多。桶可以被认为是该区域的强度分布。
MSER对象检查不同强度阈值之间的区域区域大小的变化。该变化必须小于MaxAreaVariation被认为是稳定的参数的值。
在高层次上,可以通过考虑表示一系列桶的图像的强度分布来解释MSER。想象一下,水桶的顶部与地面齐平,并在其中一个水桶上打开软管。当水装入桶中时,它溢出,下一个桶开始填满。较小的水域加入并成为较大的水体,最后整个区域都被填满。当水充满桶时,会根据MSER稳定性标准进行检查。区域以不同的强度阈值出现,增长和合并。
函数使用示意:
句法:
regions = detectMSERFeatures(I)
[regions,cc] = detectMSERFeatures(I)
[_] = detectMSERFeatures(I,Name,Value)
描述:
1. regions = detectMSERFeatures(I)返回一个MSERRegions对象,regions包含有关在2-D灰度输入图像中检测到的MSER特征的信息I。该对象使用最大稳定极值区域(MSER)算法来查找区域。
2. [regions,cc] = detectMSERFeatures(I)可选地返回连接的组件结构中的MSER区域。
3. [_] = detectMSERFeatures(I,Name,Value)设置由一个或多个Name,Value对参数指定的附加选项。
举例:
读取图像并检测MSER区域。
I = imread('cameraman.tif'); region = detectMSERFeatures(I); %可视化由存储在返回的“区域”对象内的像素列表描述的MSER区域。 figure; imshow(I); 抱上 ; plot(区域,'showPixelList',true,'showEllipses',false); %显示区域椭圆轮廓及重心 figure; imshow(I); hold on; plot(regions);
二、MSER提取文字区域并初步筛选分类
在之前区域提取的基础上,手工建立正负样本集:(包括样本图片集与标签文件)对所有样本提取hog特征并进行SVM分类,代码如下:
ReadList1 = textread('pos_label.txt','%s','delimiter','\n');%载入正样本列表 sz1=size(ReadList1); label1=ones(sz1(1),1); %正阳本标签 ReadList2 = textread('neg_label.txt','%s','delimiter','\n');%载入负样本列表 sz2=size(ReadList2); label2=zeros(sz2(1),1);%负样本标签 label=[label1',label2']';%标签汇总 total_num=length(label); data=zeros(total_num,324); %读取正样本并计算hog特征 for i=1:sz1(1) name= char(ReadList1(i,1)); image=imread(strcat('C:\Users\赵晋媛\Desktop\MSER\pos\',name)); im=imresize(image,[64,64]); % % % img=rgb2gray(im); hog =hogcalculator(im); c1=cell2mat(hog); c1=double(c1); data(i,:)=c1; end %读取负样本并计算hog特征 for j=1:sz2(1) name= char(ReadList2(j,1)); image=imread(strcat('C:\Users\赵晋媛\Desktop\MSER\neg\',name)); im=imresize(image,[64,64]); % % % img=rgb2gray(im); hog =hogcalculator(im); c1=cell2mat(hog); c1=double(c1); data(sz1(1)+j,:)=c1; end [train, test] = crossvalind('holdOut',label); cp = classperf(label); svmStruct = svmtrain(data(train,:),label(train)); save svmStruct svmStruct classes = svmclassify(svmStruct,data(test,:)); classperf(cp,classes,test); cp.CorrectRate % % %% 训练完成后保存 svmStruct即可对新输入的对象进行分类了无需再执行上面训练阶段代码
之后生成svmStruct文件,调用该文件进行测试:
% load svmStruct % test=imread('te1.bmp'); % % im=imresize(test,[64,64]); % % img=rgb2gray(im); % hogt =hogcalculator(im); % c2=cell2mat(hog); % c2=double(c2); % classes = svmclassify(svmStruct,c2);%classes的值即为分类结果
其中,对图片提取hog特征的代码为:
function [ feature ] = hogcalculator( img ) %UNTITLED3 此处显示有关此函数的摘要 % 此处显示详细说明 % imshow(img,[]); [m n]=size(img); img=double( 4000 img); img=sqrt(img); %伽马校正 %下面是求边缘 fy=[-1 0 1]; %定义竖直模板 fx=fy'; %定义水平模板 Iy=imfilter(img,fy,'replicate'); %竖直边缘 Ix=imfilter(img,fx,'replicate'); %水平边缘 Ied=sqrt(Ix.^2+Iy.^2); %边缘强度 Iphase=Iy./Ix; %边缘斜率,有些为inf,-inf,nan,其中nan需要再处理一下 %下面是求cell step=16; %step*step个像素作为一个单元 orient=9; %方向直方图的方向个数 jiao=360/orient; %每个方向包含的角度数 Cell=cell(1,1); %所有的角度直方图,cell是可以动态增加的,所以先设了一个 ii=1; jj=1; for i=1:step:m %如果处理的m/step不是整数,最好是i=1:step:m-step ii=1; for j=1:step:n %注释同上 tmpx=Ix(i:i+step-1,j:j+step-1); tmped=Ied(i:i+step-1,j:j+step-1); tmped=tmped/sum(sum(tmped)); %局部边缘强度归一化 tmpphase=Iphase(i:i+step-1,j:j+step-1); Hist=zeros(1,orient); %当前step*step像素块统计角度直方图,就是cell for p=1:step for q=1:step if isnan(tmpphase(p,q))==1 %0/0会得到nan,如果像素是nan,重设为0 tmpphase(p,q)=0; end ang=atan(tmpphase(p,q)); %atan求的是[-90 90]度之间 ang=mod(ang*180/pi,360); %全部变正,-90变270 if tmpx(p,q)<0 %根据x方向确定真正的角度 if ang<90 %如果是第一象限 ang=ang+180; %移到第三象限 end if ang>270 %如果是第四象限 ang=ang-180; %移到第二象限 end end ang=ang+0.0000001; %防止ang为0 Hist(ceil(ang/jiao))=Hist(ceil(ang/jiao))+tmped(p,q); %ceil向上取整,使用边缘强度加权 end end Hist=Hist/sum(Hist); %方向直方图归一化 Cell{ii,jj}=Hist; %放入Cell中 ii=ii+1; %针对Cell的y坐标循环变量 end jj=jj+1; %针对Cell的x坐标循环变量 end %下面是求feature,2*2个cell合成一个block,没有显式的求block [m n]=size(Cell); feature=cell(1,(m-1)*(n-1)); for i=1:m-1 for j=1:n-1 f=[]; f=[f Cell{i,j}(:)' Cell{i,j+1}(:)' Cell{i+1,j}(:)' Cell{i+1,j+1}(:)']; feature{(i-1)*(n-1)+j}=f; end end %到此结束,feature即为所求 %下面是为了显示而写的 % l=length(feature); % f=[]; % for i=1:l % f=[f;feature{i}(:)']; % end % figure % mesh(f) end
由此,初步实现了对MSER提取的特征进行SVM分类的结果。
相关文章推荐
- Matlab-vision包学习-Feature Detection,Extraction and Matching-MSER特征提取
- MATLAB中关于图像特征提取相关内容
- [转载]MATLAB读取音频文件并进行音频特征提取
- matlab实现彩色图像特征提取1
- 影像自动配准 之 特征(角点)提取 之 matlab
- Hessian矩阵提取特征点原理及其Matlab实现
- 文本分类特征提取之Word2Vec
- icepdf无法提取部分标题文字
- 用scikit-learn和jieba支持中文文本特征提取和分类的测例
- 在matlab中提取一个比较大的矩阵的部分元素
- 目标检测、识别、分类、特征点的提取
- 卷积Convolution和池化pooling特征提取,分类
- 基于sklearn的文本特征提取与分类
- 图像处理之Matlab特征提取和表达
- matlab学习:SIFT特征提取
- 机器学习特征表达——日期与时间特征做离散处理(数字到分类的映射),稀疏类分组(相似特征归档),创建虚拟变量(提取新特征) 本质就是要么多变少,或少变多
- 【Machine Learning】【Python】提取直方图特征做图片预分类(Decision Tree, Random Forest, Adaboost)
- matlab纹理特征提取代码
- HOG特征提取 matlab
- Caffe Matlab feature extraction 特征提取