hlayumi的个人空间 https://blog.eetop.cn/hslogic [收藏] [复制] [分享] [RSS]

空间首页 动态 记录 日志 相册 主题 分享 留言板 个人资料

日志

目标检测的matlab仿真

已有 11433 次阅读| 2018-10-8 21:08 |系统分类:芯片设计

I=imread('1val1.tif');
[m,n]=size(I);I=double(I);
mark(1,1)=I(1,1);mark(1,2)=1;
c=1;S=zeros(m,n);S(1,1)=c;
%c为联通区域的数目;

%用标记法进行区域划分;
%将当前目标依次与左前点、左上点、正上点、右上点比较,如果值相似,作相同标记
%否则标记+1为新的区域。
for i=1:m
    for j=1:n
        if i==1&j==1;
        elseif i==1&j>=2 %对第一行的元素进行区域划分
            if abs(I(i,j)-I(i,j-1))<25
                S(i,j)=S(i,j-1);
                a=S(i,j);
                mark(a,1)=(I(i,j)+mark(a,1)*mark(a,2))/(mark(a,2)+1);
                mark(a,2)=mark(a,2)+1;
            else
                c=c+1;S(i,j)=c;a=S(i,j);
                mark(a,1)=I(i,j);
                mark(a,2)=1;
            end
        elseif j==1&i>=2 %对第一列的元素进行区域划分
            if abs(I(i,j)-I(i-1,j))<25
               S(i,j)=S(i-1,j);a=S(i,j);
               mark(a,1)=(I(i,j)+mark(a,1)*mark(a,2))/(mark(a,2)+1);
               mark(a,2)=mark(a,2)+1;
            elseif abs(I(i,j)-I(i-1,j+1))<25
               S(i,j)=S(i-1,j+1);a=S(i,j);
               mark(a,1)=(I(i,j)+mark(a,1)*mark(a,2))/(mark(a,2)+1);
               mark(a,2)=mark(a,2)+1; 
            else
                c=c+1;S(i,j)=c;a=S(i,j);
                mark(a,1)=I(i,j);
                mark(a,2)=1;
            end
        elseif i>1&j==n %对最右边列进行区域划分
            if abs(I(i,j)-I(i,j-1))<25
               S(i,j)=S(i,j-1);a=S(i,j);
               mark(a,1)=(I(i,j)+mark(a,1)*mark(a,2))/(mark(a,2)+1);
               mark(a,2)=mark(a,2)+1;
            elseif abs(I(i,j)-I(i-1,j-1))<25
               S(i,j)=S(i-1,j-1);a=S(i,j);
               mark(a,1)=(I(i,j)+mark(a,1)*mark(a,2))/(mark(a,2)+1);
               mark(a,2)=mark(a,2)+1;
            elseif abs(I(i,j)-I(i-1,j))<25
               S(i,j)=S(i-1,j);a=S(i,j);
               mark(a,1)=(I(i,j)+mark(a,1)*mark(a,2))/(mark(a,2)+1);
               mark(a,2)=mark(a,2)+1;
            else
                c=c+1;S(i,j)=c;a=S(i,j);
                mark(a,1)=I(i,j);
                mark(a,2)=1;
            end
        else       % 对中间元素进行区域划分
            if abs(I(i,j)-I(i,j-1))<25
               S(i,j)=S(i,j-1);a=S(i,j);
               mark(a,1)=(I(i,j)+mark(a,1)*mark(a,2))/(mark(a,2)+1);
               mark(a,2)=mark(a,2)+1;
            elseif abs(I(i,j)-I(i-1,j-1))<25
               S(i,j)=S(i-1,j-1);a=S(i,j);
               mark(a,1)=(I(i,j)+mark(a,1)*mark(a,2))/(mark(a,2)+1);
               mark(a,2)=mark(a,2)+1;
            elseif abs(I(i,j)-I(i-1,j))<25
               S(i,j)=S(i-1,j);a=S(i,j);
               mark(a,1)=(I(i,j)+mark(a,1)*mark(a,2))/(mark(a,2)+1);
               mark(a,2)=mark(a,2)+1;
            elseif abs(I(i,j)-I(i-1,j+1))<25
               S(i,j)=S(i-1,j+1);a=S(i,j);
               mark(a,1)=(I(i,j)+mark(a,1)*mark(a,2))/(mark(a,2)+1);
               mark(a,2)=mark(a,2)+1;
            else
                c=c+1;S(i,j)=c;a=S(i,j);
                mark(a,1)=I(i,j);
                mark(a,2)=1;
            end
        end
    end
end

b=1;error=[0,0];
for i=2:m  %寻找本属于同一类但因算法而归为异类的区域
    for j=1:n-2
        if (abs(I(i,j)-I(i-1,j+2))<25)&(S(i,j)~=S(i-1,j+2))
            if find(error(:,1)==S(i,j));
            else
                error(b,1)=S(i,j);error(b,2)=S(i-1,j+2);
                b=b+1;
            end
        end
    end
end

d=1;
for d=1:b-1
    a=error(d,1);c=error(d,2);%a为需要纠正的区域的号码,c为目标区域号码
    if a~=c
        mark(c,1)=(mark(a,1)*mark(a,2)+mark(c,1)*mark(c,2))/(mark(c,2)+mark(a,2));
        mark(a,1)=0;   %纠正均值
        mark(c,2)=mark(c,2)+mark(a,2);mark(a,2)=0;  %纠正区域面积
        for e=d:b-1 %将已被纠正的区域类别号全被用目标区域的类别号代替
            if error(e,2)==a
                error(e,2)=c;
            end
        end
    else
    end
end

    
for i=1:m
    for j=1:n
        if find(error(:,1)==S(i,j))
           b=find(error(:,1)==S(i,j));
           S(i,j)=error(b,2);
        end
    end
end
            
       
c=size(mark(:,1));
b=1;
for a=1:c                            %寻找是物体的区域
    if mark(a,2)>10
        target(b)=a;
        b=b+1;
    end 
end
%对各联通区域用其区域的均值重新赋值; 
for i=1:m
    for j=1:n
        if find(target(:)==S(i,j))
            a=S(i,j);
            Y(i,j)=mark(a,1);
        else
            Y(i,j)=0;
        end
    end
end
        


y=uint8(Y);
y=im2bw(y);
%y=imfill(y,'holes');
imshow(y);
clear a b c d e i j;

点赞

评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 注册

  • 关注TA
  • 加好友
  • 联系TA
  • 0

    周排名
  • 0

    月排名
  • 0

    总排名
  • 0

    关注
  • 5

    粉丝
  • 0

    好友
  • 1

    获赞
  • 16

    评论
  • 5260

    访问数
关闭

站长推荐 上一条 /2 下一条

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-4-25 01:36 , Processed in 0.016549 second(s), 7 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
返回顶部