zoukankan      html  css  js  c++  java
  • MATLAB·提取图像中多个目标

    基于matlab工具箱提取图像中的多目标特征(代码如下):

    代码前面部分为提取图像的边界信息,调用了后面的遍历函数Pixel_Search,函数实现方法见后~

    %%ROI Testing
    close all;
    clear all;
    clc;
    I=imread('Test.png');
    I=rgb2gray(I);
    I=I(1:210,1:210);
    [m,n]=size(I);
    I_BW=I;
    for Row1=1:m
        for Clo1=1:n
            if I(Row1,Clo1)>190
                I_BW(Row1,Clo1)=255;
            else
                I_BW(Row1,Clo1)=0;
            end
        end
    end
    imshow(I)
    %figure,imhist(I)
    figure,imshow(I_BW)
    I_BW_morph=bwmorph(I_BW,'erod',0.8);%形态学腐蚀原理
    Filter=[-1,-1,-1;-1,8,-1;-1,-1,-1];%高通滤波器,挖出二值图像的边界像素
    I_Filter=imfilter(I_BW_morph,Filter);%使用滤波的方法得到的图像的边界部分是白色的,边界有变化所以经过高通滤波器后为白色
    figure,imshow(I_Filter)
    I_Edge=I_Filter;
    I_Edge(:,2)=0;%由于采用的是滤波器的方法来实现边缘的提取,在图像的边界部分会出现颜色的变化,因此我们需要把图像边缘的部分置为0
    I_Edge(:,n-1)=0;
    I_Edge(2,:)=0;
    I_Edge(m-1,:)=0;
    figure,imshow(I_Edge)
    I_Edge=uint8(I_Edge);%图像uint8化
    ROI_Buffer=uint8(zeros(m,n,5));%四个模板缓存区域
    C_Shape=zeros(4,1);
    Label=0;
    
    for Row2=1:m
        for Clo2=1:n
            if I_Edge(Row2,Clo2)==1
                Label=Label+1
                [ROI_Buffer(:,:,Label),C_Shape(Label,1)]=Pixel_Search(I_Edge,Row2,Clo2,m,n);%把当前的数据赋给模板
                figure,imshow(255*ROI_Buffer(:,:,Label));%显示所得到的对应标号为Label的图像边界,这里需要注意的问题是:由图像的色彩等级不同,因此得到的图像可能全是黑色,需要乘以255(uint8)
                C_Shape(Label,1)
                I_Edge=I_Edge-ROI_Buffer(:,:,Label);%去除原图中已经提取完成的部分
            end
        end
    end
    Pixel_Search函数实现如下:
    %While 方法寻找边缘轮廓 采用4邻域方式
    function [Pic_Process,C]=Pixel_Search(Pic,Row,Clo,m,n)
        While_Flag=1;
        C=1;%周长像素点计数
        Pic_Process=zeros(m,n);%模板建立
        Pic_Buffer=Pic;%图像缓存建立
        while (While_Flag==1)%while循环判断
            C=C+1;
            Pic_Process(Row,Clo)=1;%图像模板区域置位
            Pic_Buffer(Row,Clo)=0;%图像缓冲区域清零
            
            if Clo<=1 || Row>m || Clo>n || Row<=1%防止图像检测过程中,边缘溢出
                break;
            end
            
            if Pic_Buffer(Row,Clo-1)==1%循环判断区域结果
                Clo=Clo-1;
                While_Flag=1;
            else if Pic_Buffer(Row+1,Clo)==1%循环判断区域结果
                    Row=Row+1; 
                    While_Flag=1;
                else if Pic_Buffer(Row,Clo+1)==1%循环判断区域结果
                        Clo=Clo+1;
                        While_Flag=1;
                    else if Pic_Buffer(Row-1,Clo)==1%循环判断区域结果
                            Row=Row-1; 
                            While_Flag=1;
                        else
                            While_Flag=0;%各个循环条件都不满足,即像素种子点周围没有边缘像素,即可跳出while循环,结束搜索
                        end
                    end
                end
            end
        end
    end

    处理的图片如下:

    原图:显示图像:阈值化二值分割:滤波导致的边缘问题:第一个区域提取:第二个区域提取:第三个区域提取:

    后期的优化还需要进一步完成,对于复杂的图形的ROI区域分割还需要进一步处理,现已经解决了联通区域的周长问题,还需要解决的问题有面积的求解以及区域的形态学特征的求解~

    注:这里有一个问题,由于边缘的提取使用了高通滤波器,边缘的路径出现大量的弯折现象,这就导致了程序计算得到的边界周长约1.8倍于实际的ROI区域的边界周长,至于解决办法,后面解决,现在先记录在案~

    A1:祖冲之切割边缘按照多边形求解周长。

    A2:求解相邻像素点的中间值,x=(x1+x2)/2,y=(y1+y2)/2,最后根据新的边缘求解周长。

    在这里要感谢GISPALAB实验室的各位老师和学长学姐的帮助!谢谢~

  • 相关阅读:
    PAT Basic 1077 互评成绩计算 (20 分)
    PAT Basic 1055 集体照 (25 分)
    PAT Basic 1059 C语言竞赛 (20 分)
    PAT Basic 1072 开学寄语 (20 分)
    PAT Basic 1049 数列的片段和 (20 分)
    蓝桥杯BASIC-13 数列排序
    蓝桥杯入门——3.序列求和
    蓝桥杯入门——2.圆的面积
    蓝桥杯入门——1.Fibonacci数列
    树的总结(遍历,BST,AVL原型,堆,练习题)
  • 原文地址:https://www.cnblogs.com/uestc-mm/p/5507151.html
Copyright © 2011-2022 走看看