最小距離分類器,互動式選取影像樣本分類資料,進行最小距離分類(實現歐式距離,馬氏距離,計程距離)

癮. .發表於2021-01-03

最小距離分類器

%最小距離分類器,互動式選取影像樣本分類資料,進行最小距離分類(實現歐式距離,馬氏距離,計程距離)
function re=mindis()
[filename,pathname]=uigetfile({'*.jpg;*.bmp;*.tif;*.png;*.gif','All Image Files';'*.*','All Files'});%動態開啟檔案
image = imread([pathname,filename]);%讀取
figure(1);imshow(image);
image=double(image);
[m,n,bands]=size(image);
k=input('請輸入要分類的個數:  ');%輸入要選取的樣本類別數
aver=zeros(k,bands);%申請矩陣空間儲存樣本資料各類別各波段均值
%對所選取樣本資料進行處理求得各類別均值
for i=1:k%對選中類別迴圈
    str=['請在螢幕影像上選擇第',num2str(i),'種分類樣本,選擇完畢請回車確定'];
    disp(str);
    [y,x]=getpts;%從影像上獲取資料點
    A=[round(y),round(x)];
    for band=1:bands%對影像每個波段進行計算,求取指定類別每個波段均值
        Sum=0;
         for count=1:size(A,1)%對取得點迴圈
             temp=image(:,:,band);
            Sum=Sum+temp(A(count,2),A(count,1));
         end
          aver(i,band)=Sum/size(A,1);%求均值
    end
end
image=reshape(image,m*n,bands);%將影像資料重塑成為一列為一個波段資料的形式,便於計算
dis=zeros(k,m*n);%申請矩陣空間儲存每個類別影像各個點資料分別到各波段均值的距離的和
type=input('請輸入要選擇的分類型別: 1.歐式距離 2.馬氏距離  3.計程距離  : ');
switch type%分別代入不同公式
    case 1
        %對每個類別進行迴圈,求出各個類別的距離,後面進行比較
        for t=1:k
        tem=image-aver(t,:);%影像資料與樣本每個類別每個波段均值分別求差值
        dis(t,:)=sqrt(sum((tem.*tem).'));  %和的平方根
        end
    case 2
        %申請矩陣儲存樣本資料均值協方差
        T=zeros(bands,bands,k);
        for t=1:k
            T(:,:,t)=cov(aver);%求取協方差
            tem=image-aver(t,:);
            dis(t,:)=sqrt(sum((tem*T(:,:,t).*tem).'));  %同上
        end
    case 3
        for t=1:k
            tem=image-aver(t,:);
            dis(t,:)=sum(abs(tem.'));%絕對值之和
        end
end
    [~,index]=min(dis);%求各距離最小值
    index=reshape(index,m,n);%重塑回原影像排列
    re=index/k;%給各類別賦值指定灰度值便於區分,也可賦值其他
    figure(2),imshow((re));%顯示
end

相關文章