连通域识别
我是做图像的文本定位,现在正在对图像的连通域生成最小外接矩阵时,遇到了一个问题我已经用bwlabel函数标记了各个连通域,并找到了各个连通域的最上、最下、最左、最右的坐标(存在Area_candidate = struct('top',{},'left',{},'bottom',{},'right',{});中),在生成最小外接矩阵时,发现如果图像有边框的话,其边框会生成一个最小外接矩阵,从而将边框里面的内容覆盖掉(里面的文字生成的最小外接矩阵就看不到了),我想将这个边框的连通域在生成最小外接矩阵之前识别并抹掉,求高人指点。
P.S:本科的毕业设计中遇到的问题,第一次自己动手,在这里先拜谢了。 举个例子
a={1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1;
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1;
1 0 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 3 0 0 1;
1 0 2 2 2 2 0 0 0 0 0 0 0 0 0 0 3 3 3 0 1;
1 0 2 0 2 2 2 0 0 0 0 0 0 0 0 0 3 3 0 0 1;
1 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1;}
如果正常的话,1,2,3,这 3 个连通域各自生成最小外接矩阵,结果1生成的矩阵就把2和3生成的矩阵覆盖掉了,我想把1识别并去掉。
[ 本帖最后由 eight 于 2007-5-17 21:52 编辑 ] 原帖由 Feather013 于 2007-5-17 16:02 发表 http://www.chinavib.com/forum/images/common/back.gif
据个例子
a={1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1;
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1;
1 0 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 3 0 0 1;
1 0 2 2 2 2 0 0 0 0 0 0 0 0 0 0 3 3 ...
没看懂,建议就这个a,给出你的代码和结果 我先把有用的代码部分贴出来:
输入是一个矩阵I
Ileast = bwlabel(I,4);%标定图像的连通域
nummax = max(Ileast(:));
col=length(I(:,1)); %行数
row=length(I(1,:)); %列数
Area_candidate = struct('top',{},'left',{},'bottom',{},'right',{});%初始化结构体
for n=1:nummax
Area_candidate(n).top=col;
Area_candidate(n).left=row;
Area_candidate(n).bottom=0;
Area_candidate(n).right=0;
end
然后判定各个连通域的最小外接矩形的边界的值
for a=1:col
for b=1:row
if Ileast(a,b)~=0
Area_candidate(Ileast(a,b)).top = min ( Area_candidate(Ileast(a,b)).top ,a);%得到各个连通域的边界
Area_candidate(Ileast(a,b)).left = min ( Area_candidate(Ileast(a,b)).left ,b);
Area_candidate(Ileast(a,b)).bottom = max ( Area_candidate(Ileast(a,b)).bottom ,a);
Area_candidate(Ileast(a,b)).right = max ( Area_candidate(Ileast(a,b)).right ,b);
end
end
end
然后再新建的空矩阵上得出图像
for n=1:nummax
I_out(Area_candidate(n).top:Area_candidate(n).bottom , Area_candidate(n).left:Area_candidate(n).right) =1;%填充矩形
end
结果输出的矩阵就是一个全1的矩阵
而我希望得到的矩阵(图像)是:
I_out =
{0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0;
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0;
0 0 1 1 1 1 1 0 0 0 0 0 0 0 0 0 1 1 1 0 0;
0 0 1 1 1 1 1 0 0 0 0 0 0 0 0 0 1 1 1 0 0;
0 0 1 1 1 1 1 0 0 0 0 0 0 0 0 0 1 1 1 0 0;
0 0 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0;}
[ 本帖最后由 Feather013 于 2007-5-17 21:26 编辑 ] 原帖由 Feather013 于 2007-5-17 21:22 发表 http://www.chinavib.com/forum/images/common/back.gif
我先把有用的代码部分贴出来:
输入是一个矩阵I
Ileast = bwlabel(I,4);%标定图像的连通域
nummax = max(Ileast(:));
col=length(I(:,1)); %行数
row=length(I(1,:)); %列数
Area_candidate = struct ...
请恕我能力、精力有限,我实在看不懂从2楼的 a 如何变成4楼的 I_out 这个函数默认的输入是 I 忘记改成 a 了。。。
Ileast = bwlabel(a,4);%标定图像的连通域
这里应该是a,不是I 忘记改了
sorry...
[ 本帖最后由 Feather013 于 2007-5-17 22:17 编辑 ] 原帖由 Feather013 于 2007-5-17 22:16 发表 http://www.chinavib.com/forum/images/common/back.gif
这个函数默认的输入是 I 忘记改成 a 了。。。
Ileast = bwlabel(a,4);%标定图像的连通域
这里应该是a,不是I 忘记改了
sorry...
你的意思是补全连通区域中的0,并且得到的面积最小?那应该可以用形态学的方法,不过我没有做过,不太懂 恩,就是这个意思
就是遇到了这种类似的边框 不会处理
页:
[1]