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區域分割還須要進一步處理,現已經解決了聯通區域的周長問題,還須要解決的問題有面積的求解以及區域的形態學特徵的求解~ui

注:這裏有一個問題,因爲邊緣的提取使用了高通濾波器,邊緣的路徑出現大量的彎折現象,這就致使了程序計算獲得的邊界周長約1.8倍於實際的ROI區域的邊界周長,至於解決辦法,後面解決,如今先記錄在案~spa

A1:祖沖之切割邊緣按照多邊形求解周長。3d

A2:求解相鄰像素點的中間值,x=(x1+x2)/2,y=(y1+y2)/2,最後根據新的邊緣求解周長。code

在這裏要感謝GISPALAB實驗室的各位老師和學長學姐的幫助!謝謝~blog

相關文章
相關標籤/搜索