資源簡介
用matlab編寫的面積法圖像處理識別圖中棒材個數,圖片名稱為0,且應放于與程序所在同一目錄
代碼片段和文件信息
function?mianji()
global?TotalRow
global?TotalCol
global?ImageLable
%%%%%%%?處理圖像?%%%%%%%
%I為原始圖像
I=imread(‘0.jpg‘);
I1=rgb2gray(I);%灰度化
I2=medfilt2(I1[33]);%中值濾波
thresh=graythresh(I2);
I3=im2bw(I2thresh);%I3為二值化后的圖像
se=strel(‘disk‘2);
ImOpen=imopen(I3se);%開運算
%%%%%?連通域貼標簽?%%%%%%
%計算連通域的數量number
[TotalRowTotalCol]=size(ImOpen);%獲得圖像的總行數TotalRow總列數TotalCol
ImageLable=double(ImOpen);%獲得空標簽
number=1;%連通域的個數賦初值0
seed=0;%種子數賦初值0
for?row=1:TotalRow
????for?col=1:TotalCol
????????K=zeros(10002);%K為存放種子點坐標的2列矩陣
????????%尋找一個連通域中的第一個種子像素
????????if?ImageLable(rowcol)==1?
????????????seed=1;
????????????K(11)=row;K(12)=col;
????????????number=number+1;
????????????ImageLable(rowcol)=number;%標記
????????end
????????%進行區域生長
????????while?seed~=0?%直到所有的種子都生長過才會停止while循環
????????????R=K(seed1);C=K(seed2);?%選取K的最后一個為生長用種子
????????????seed=seed-1;%使用過的種子下次不再使用
????????????%八連通情況下判斷種子鄰域是否物體
????????????for?rr=-1:1
????????????????for?cc=-1:1
????????????????????if?R+rr>=1?&&?C+cc>=1?&&?R+rr<=TotalRow?&&?C+cc<=TotalCol?&&?ImageLable(R+rrC+cc)==1;%不考慮邊緣
????????????????????????ImageLable(R+rrC+cc)=number;%標記
????????????????????????seed=seed+1;
????????????????????????K(seed1)=R+rr;K(seed2)=C+cc;
????????????????????end?%?if?R+rr>=1...的end
????????????????end?%?for?cc=-1:1的end
????????????end?%?for?rr=-1:1的end
????????end?%?while?seed~=0的end
????end?%?for?col=1:TotalCol的end
end?%?for?row=1:TotalRow?的end
number=number-1;
LableMax=number+1;%標簽最大值
%%%%%%?求最佳平均面積?%%%%%%
%step1:計算每個連通域的面積
Area=[];%Area為存放面積的數組
Center=zeros(number2);%Center為存放中心點的矩陣
for?LableNum=2:LableMax?%標簽數值是從2到LableMax
????a=LableNum-1;
????%拷貝過來的findarea函數開始
????
????????Arrr=0;%連通域的“質量”每個像素質量為1
XSum=0;%連通域的橫坐標之和
YSum=0;%連通域的縱坐標之和
for?x=1:TotalRow
????for?y=1:TotalCol
????????if?(ImageLable(xy)==LableNum)%選取標簽圖像中標簽為LableNum的像素
????????????XSum=XSum+x;%求目標連通域橫坐標和
????????????YSum=YSum+y;%求目標聯通域縱坐標和
????????????Arrr=Arrr+1;%求目標連通域“總質量”,即像素總數
???????end
????end
end
centerX=round(XSum/Arrr);
centerY=round(YSum/Arrr);
Area(a)=Arrr;
Center(a1)=centerX;
Center(a2)=centerY;
??%拷貝過來的findarea函數結束???
????
end
%step2:據算法得到最接近實際的面積均值
%AreaAver=areaaver(Area);
%拷貝過來的areaaver函數?開始
AreaOrder=sort(Area‘ascend‘
評論
共有 條評論