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