声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 4723|回复: 7

[图像处理] 连通域识别

[复制链接]
发表于 2007-5-17 15:45 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
我是做图像的文本定位,现在正在对图像的连通域生成最小外接矩阵时,遇到了一个问题
我已经用bwlabel函数标记了各个连通域,并找到了各个连通域的最上、最下、最左、最右的坐标(存在Area_candidate = struct('top',{},'left',{},'bottom',{},'right',{});中),在生成最小外接矩阵时,发现如果图像有边框的话,其边框会生成一个最小外接矩阵,从而将边框里面的内容覆盖掉(里面的文字生成的最小外接矩阵就看不到了),我想将这个边框的连通域在生成最小外接矩阵之前识别并抹掉,求高人指点。

P.S:本科的毕业设计中遇到的问题,第一次自己动手,在这里先拜谢了。
回复
分享到:

使用道具 举报

 楼主| 发表于 2007-5-17 16:02 | 显示全部楼层
举个例子
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 编辑 ]
发表于 2007-5-17 19:10 | 显示全部楼层
原帖由 Feather013 于 2007-5-17 16:02 发表
据个例子
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,给出你的代码和结果
 楼主| 发表于 2007-5-17 21:22 | 显示全部楼层
我先把有用的代码部分贴出来:
输入是一个矩阵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 编辑 ]
发表于 2007-5-17 21:53 | 显示全部楼层
原帖由 Feather013 于 2007-5-17 21:22 发表
我先把有用的代码部分贴出来:
输入是一个矩阵I
Ileast = bwlabel(I,4);%标定图像的连通域
nummax = max(Ileast(:));
col=length(I(:,1));   %行数
row=length(I(1,:)); %列数

Area_candidate = struct ...


请恕我能力、精力有限,我实在看不懂从2楼的 a 如何变成4楼的 I_out
 楼主| 发表于 2007-5-17 22:16 | 显示全部楼层
这个函数默认的输入是 I 忘记改成 a 了。。。

Ileast = bwlabel(a,4);%标定图像的连通域
这里应该是a,不是I 忘记改了
sorry...

[ 本帖最后由 Feather013 于 2007-5-17 22:17 编辑 ]
发表于 2007-5-17 22:19 | 显示全部楼层
原帖由 Feather013 于 2007-5-17 22:16 发表
这个函数默认的输入是 I 忘记改成 a 了。。。

Ileast = bwlabel(a,4);%标定图像的连通域
这里应该是a,不是I 忘记改了
sorry...



你的意思是补全连通区域中的0,并且得到的面积最小?那应该可以用形态学的方法,不过我没有做过,不太懂
 楼主| 发表于 2007-5-17 22:27 | 显示全部楼层
恩,就是这个意思
就是遇到了这种类似的边框 不会处理
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-12-12 17:47 , Processed in 0.069953 second(s), 17 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表