✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。

🍎个人主页:Matlab科研工作室

🍊个人信条:格物致知。

⛄ 内容介绍

为提取云团反射率图像内部层次类特征和轮廓线上不规则的凹陷类特征,在构建基于图像内容的层次结构模型的基础上,提出相对极坐标系下的距离链码和基于八方向链码的累积导数和差码方法,前者用于层次类特征提取,后者用于轮廓形态特征的提取,构建梯度特征、云砧特征以及凹陷特征的提取算法.实验证明,该方法下的特征类间区分度高,运行速度快,可用于解决非刚体图像的相关特征的提取.

⛄ 完整代码

%此函数来提取特征线链码
%-------------------------

%-------------------------
%im为输入图像。注意,该图像必须是经过sobel,log,canny,prewitt等算子进行过边缘提取后的二值图像
%result为返回值,返回一个矩阵。矩阵的每行前两个数记录每一条特征线的起始坐标x1,y1值,终点坐标x2,y2。每行其余值记录每条特征线的链码。
%--------方向表------
%        1 2 3
%        8   4
%        7 6 5
%--------------------

function result=listcode(im)

im2=im;
[m n]=size(im);
count=1;      %用来记录特征线的数量
%遍历原图,搜索链码起始点
for i=1:m
    for j=1:n
        if(im2(i,j)==1)
            xy=searchtip(im2,i,j);
            [m n]=size(im2);
            x0=xy(1);   %用points记录所有链码起始点的位置
            y0=xy(2);
            next=1;    %用来判断是否结束对当前链码的搜索
            number=1;  %用来记录当前链码以搜索点的数量
            list=[];
            list(number)=0;
            x=xy(1);
            y=xy(2);
            %每当搜索到一个起始点,搜索其周围点,追寻链码轨迹
            while(next==1)
                if(x<=0|x>m|y<=0|y>n)    %如果链码当前点已到达边界,则停止搜索
                    next=0;
                else
                    im2(x,y)=0;       %把已搜索过的点值置零,以免重复搜索

                    %按照方向表中从1到8的顺序检索当前点周围是否存在非0点
                    if(im2(x,y+1)==1)
                        list(number)=4;
                        x=x;
                        y=y+1;
                        x1=x;
                        y1=y;
                        number=1+number;
                        if(x==x0&y==y0)     %判断是否回到起始点,若是则当前特征线链码提取结束
                            next=0;
                        end
                    elseif(im2(x+1,y)==1)
                        list(number)=6;
                        x=x+1;
                        y=y;
                        x1=x;
                        y1=y;
                        number=1+number;
                        if(x==x0&y==y0)
                            next=0;
                        end
                    elseif(im2(x,y-1)==1)
                        list(number)=8;
                        x=x;
                        y=y-1;
                        x1=x;
                        y1=y;
                        number=number+1;
                        if(x==x0&y==y0)
                            next=0;
                        end
                    elseif(im2(x-1,y)==1)
                        list(number)=2;
                        x=x-1;
                        y=y;
                        x1=x;
                        y1=y;
                        number=1+number;
                        if(x==x0&y==y0)
                            next=0;
                        end
                    elseif(im2(x+1,y+1)==1)
                        list(number)=5;
                        x=x+1;
                        y=y+1;
                        x1=x;
                        y1=y;
                        number=1+number;
                        if(x==x0&y==y0)
                            next=0;
                        end
                    elseif(im2(x+1,y-1)==1)
                        list(number)=7;
                        x=x+1;
                        y=y-1;
                        x1=x;
                        y1=y;
                        number=1+number;
                        if(x==x0&y==y0)
                            next=0;
                        end
                    elseif(im2(x-1,y-1)==1)
                        list(number)=1;
                        x=x-1;
                        y=y-1;
                        x1=x;
                        y1=y;
                        number=1+number;
                        if(x==x0&y==y0)
                            next=0;
                        end
                    elseif(im2(x-1,y+1)==1)
                        list(number)=3;
                        x=x-1;
                        y=y+1;
                        x1=x;
                        y1=y;
                        number=1+number;
                        if(x==x0&y==y0)
                            next=0;
                        end
                    else
                        next=0;
                    end
                end
            end
            list1=[x0 y0 x1 y1 list(:)'];
            [p q]=size(list1);
            list2(count,1:q)=list1;
            count=count+1;
        end
    end
end
%figure:imshow(im);
%figure:imshow(im2);
result=list2;
end
%此程序用来从特征线上一点搜索其端点
%im2为输入图像二值图像,x0,y0为起始端点坐标
function xy=searchtip(im2,x0,y0)
im=im2;
[m n]=size(im);
xy(1)=x0;
xy(2)=y0;
next=1;    %用来判断是否结束对当前链码的搜索
x=x0;
y=y0;
%每当搜索到一个起始点,搜索其周围点,追寻链码轨迹
while(next==1)
    if(x<=0|x>m|y<=0|y>n)    %如果链码当前点已到达边界,则停止搜索
        next=0;
    else
        im(x,y)=0;       %把已搜索过的点值置零,以免重复搜索

        %按照方向表中从1到8的顺序检索当前点周围是否存在非0点
        if(im(x,y+1)==1)
            x=x;
            y=y+1;
            xy(1)=x;
            xy(2)=y;
            if(x==x0&y==y0)     %判断是否回到起始点,若是则当前特征线链码提取结束
                next=0;
            end
        elseif(im(x+1,y)==1)
            x=x+1;
            y=y;
            xy(1)=x;
            xy(2)=y;
            if(x==x0&y==y0)
                next=0;
            end
        elseif(im(x,y-1)==1)
            x=x;
            y=y-1;
            xy(1)=x;
            xy(2)=y;
            if(x==x0&y==y0)
                next=0;
            end
        elseif(im(x-1,y)==1)
            x=x-1;
            y=y;
            xy(1)=x;
            xy(2)=y;
            if(x==x0&y==y0)
                next=0;
            end
        elseif(im(x+1,y+1)==1)
            x=x+1;
            y=y+1;
            xy(1)=x;
            xy(2)=y;
            if(x==x0&y==y0)
                next=0;
            end
        elseif(im(x+1,y-1)==1)
            x=x+1;
            y=y-1;
            xy(1)=x;
            xy(2)=y;
            if(x==x0&y==y0)
                next=0;
            end
        elseif(im(x-1,y-1)==1)
            x=x-1;
            y=y-1;
            xy(1)=x;
            xy(2)=y;
            if(x==x0&y==y0)
                next=0;
            end
        elseif(im(x-1,y+1)==1)
            x=x-1;
            y=y+1;
            xy(1)=x;
            xy(2)=y;
            if(x==x0&y==y0)
                next=0;
            end
        else
            next=0;
        end
    end
end
end
%此函数用来根据一个已知点来提取以该点为端点的特征线的链码
%im为输入二值图像,x0,y0为端点坐标
function result=getcode(im,x0,y0)
[m n]=size(im);
points(1)=x0;   %用points记录所有链码起始点的位置
points(2)=y0;
next=1;    %用来判断是否结束对当前链码的搜索
number=1;  %用来记录当前链码以搜索点的数量
list=[];
list(number)=0;
x=x0;
y=y0;
%每当搜索到一个起始点,搜索其周围点,追寻链码轨迹
while(next==1)
    if(x<=0|x>m|y<=0|y>n)    %如果链码当前点已到达边界,则停止搜索
        next=0;
    else
        im(x,y)=0;       %把已搜索过的点值置零,以免重复搜索
        
        %按照方向表中从1到8的顺序检索当前点周围是否存在非0点
        if(im(x,y+1)==1)
            list(number)=4;
            x=x;
            y=y+1;
            x1=x;
            y1=y;
            number=1+number;
            if(x==x0&y==y0)     %判断是否回到起始点,若是则当前特征线链码提取结束
                next=0;
            end
        elseif(im(x+1,y)==1)
            list(number)=6;
            x=x+1;
            y=y;
            x1=x;
            y1=y;
            number=1+number;
            if(x==x0&y==y0)
                next=0;
            end
        elseif(im(x,y-1)==1)
            list(number)=8;
            x=x;
            y=y-1;
            x1=x;
            y1=y;
            number=number+1;
            if(x==x0&y==y0)
                next=0;
            end
        elseif(im(x-1,y)==1)
            list(number)=2;
            x=x-1;
            y=y;
            x1=x;
            y1=y;
            number=1+number;
            if(x==x0&y==y0)
                next=0;
            end
        elseif(im(x+1,y+1)==1)
            list(number)=5;
            x=x+1;
            y=y+1;
            x1=x;
            y1=y;
            number=1+number;
            if(x==x0&y==y0)
                next=0;
            end
        elseif(im(x+1,y-1)==1)
            list(number)=7;
            x=x+1;
            y=y-1;
            x1=x;
            y1=y;
            number=1+number;
            if(x==x0&y==y0)
                next=0;
            end
        elseif(im(x-1,y-1)==1)
            list(number)=1;
            x=x-1;
            y=y-1;
            x1=x;
            y1=y;
            number=1+number;
            if(x==x0&y==y0)
                next=0;
            end
        elseif(im(x-1,y+1)==1)
            list(number)=3;
            x=x-1;
            y=y+1;
            x1=x;
            y1=y;
            number=1+number;
            if(x==x0&y==y0)
                next=0;
            end
        else
            next=0;
        end
    end
end
result=[x0 y0 x1 y1 list(:)'];
end

⛄ 运行结果

基于matlab实现链码提取_搜索

基于matlab实现链码提取_特征提取_02

⛄ 参考文献

[1] 李富裕, 李言俊, 张科. 链码技术在景象图像特征提取中的应用[J]. 中国图象图形学报, 2008(1):5.

[2] 王萍, 强兆庆, 许晋玮,等. 基于链码描述的图像图形特征提取[J]. 计算机应用, 2009(8):4.

[3] 赵珊, 王彪, 唐超颖. 基于链码表示的手臂静脉特征提取与匹配[J]. 光学学报, 2016(5):12.

⛳️ 代码获取关注我

❤️部分理论引用网络文献,若有侵权联系博主删除
❤️ 关注我领取海量matlab电子书和数学建模资料