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实验室的各位老师和学长学姐的帮助!谢谢~

  • 相关阅读:
    在VMware9.0上安装CentOS6.3+mysql5.5.28数据库 东师理想
    Python学习总结(二)python的练习方法
    gdb调试nasm语法的汇编程序(转载)
    配置Bochs
    量变与质变(生活中,技术上)
    设置gdb反汇编语法为intel(转载)
    Python学习总结(一)
    2012暑假计划
    理解TCP为什么需要进行三次握手(白话)(转载)
    对自己的学习方式的思考(转载)
  • 原文地址:https://www.cnblogs.com/uestc-mm/p/5507151.html
Copyright © 2011-2022 走看看