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實驗室的各位老師和學長學姐的幫助!謝謝~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM