基於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