【原創】【論文復現】【Matlab】【圖像處理】基於競爭性學習的非監督式圖像分割(DSRPCL法)

參考文獻:
[1]Ma J W, Wang T J. A cost-function approach to rival penalized competitive learning (RCPL) [J]. IEEE Transactions on Systems, Man, and Cybernetics-Part B: Cybernetics, 2006, 36(4): 722-737
[2]數字圖像處理. 岡薩雷斯

概述

2006年,Ma等人提出了DSRPCL算法。用戶只要適當調整權重指數與學習率,並賦予算法一個大於實際聚類數量的初始聚類數,該算法可以自行迭代出合適的聚類數量。簡單地講,該算法通過獲獎懲罰機制,自動地完成圖像的聚類分割。
該算法通過將下列目標函數E最小化,從而尋找到最佳的聚類模式:
E=12ixiωc(i)2+2Pi,jc(i)xiωjP E=\frac{1}{2}\sum_{i}||x_{i}-\omega_{c(i)}||^2+\frac{2}{P}\sum_{i,j≠c(i)}||x_i-\omega_j||^{-P}
其中,xix_i爲圖像中的某一個像素,ωc(i)\omega_{c(i)}爲距離該像素最近的聚類中心,ωj\omega_j爲某一個聚類中心,P爲權重指數。
利用梯度下降法,Ma等人導出瞭如下聚類中心的更新公式:
Δωj={α(xiωj),j=c(i)αxiωjP2(xiωj),otherwise \Delta\omega_j=\begin{cases}\alpha(x_i-\omega_j),j=c(i)\\-\alpha||x_i-\omega_j||^{-P-2}(x_i-\omega_j)&,otherwise\end{cases}
其中α\alpha爲學習率。
對於所有聚類中心來說,當算法進行某一次迭代,遍歷到其中一個像素時,若聚類中心c(i)離該像素最近,即下標爲c(i),則通過第一個式子對此聚類中心進行更新,並通過第二個式子對剩下的聚類中心進行更新。通俗的說,就是將離某像素最近的聚類中心拉近,並把剩下的踢開。
上述聚類中心更新公式稱爲DSRPCL1,使用該法遍歷像素時,需要對所有像素的聚類中心進行獎勵懲罰,所以目標函數的下降曲線十分光滑,但耗時很長。
繪製下圖耗時1分25秒。
在這裏插入圖片描述
爲了提高運算速度,Ma等人提出了改進版本(DSRPCL2):
Δωj={α(xiωj),j=c(i)αxiωjP2(xiωj),j=r(i)0,otherwise \Delta\omega_j=\begin{cases}\alpha(x_i-\omega_j),j=c(i)\\-\alpha||x_i-\omega_j||^{-P-2}(x_i-\omega_j)&,j=r(i)\\0,otherwise\end{cases}
該改進版本僅僅懲罰了競爭對手中的第一個聚類中心,保持其他競爭對手不變。
同樣,由於在迭代中沒有引入隨機,下降曲線依然十分光滑。
繪製下圖用時1分05秒,縮短了20秒。
在這裏插入圖片描述
新方法確實提高了運算速度,但是我們知道,光滑的曲線是通過在每一次迭代中遍歷所有像素得到的,這就使得運算速度存在繼續提高的空間。
在此,通過在每一次迭代中隨機選取一個像素點進行聚類中心的更新,得到了下圖的目標函數曲線。
在這裏插入圖片描述
注意,由於引入了隨機取像素的機制,所以目標函數曲線產生了大量的不規則起伏,而且由於迭代次數未設置得足夠大,也會導致每一次運行算法,得到不同的分割結果,但繪製此圖只花費了11秒。
我們增加迭代次數到500,可以得到如下的目標函數下降圖,可以看出目標函數整體上仍然是在不斷減小的。
在這裏插入圖片描述
下面展示該方法的分割效果:
設置權重指數P=0.01,學習率α\alpha=0.001,迭代500次,初始聚類數6
在這裏插入圖片描述
在這裏插入圖片描述
設置權重指數P=0.01,學習率α\alpha=0.001,迭代次數50次,初始聚類數7
在這裏插入圖片描述
在這裏插入圖片描述

代碼:

f=imread('(你想測試的圖像)');
% f=rgb2gray(f);%如果輸入圖像是彩色的,則執行此步
f=double(f);
f=f/255;
figure(1),imshow(f);
tic;
%輸入圖像的長寬
[row,col]=size(f);
%將所有像素展開
all_pixel=reshape(f,row*col,1);
%指定初始聚類數
cluster_num=7;
%指定權重指數
P=0.05;
%制定學習率
learning_rate=0.001;
%設置最大迭代次數
iter_max=100;
%保存所有能量函數值
E_all=zeros(0,1);
% 創建初始聚類中心
center=rand(cluster_num,1);
%進行聚類中心的更新
for i=1:iter_max
    %隨機取一個像素,進行聚類中心的競爭懲罰機制
    pixel_indice_random=randi([1,row*col],1);
    random_pixel=all_pixel(pixel_indice_random);
    %獲得距離像素最近的聚類中心的序號
    distance=abs(random_pixel-center);
    [~,indice]=sort(distance);
    for m=1:cluster_num
        if m==indice(1)
            %對距離像素最近的聚類中心進行獎勵
            center(m)=center(m)+learning_rate*(random_pixel-center(m));
            break;
        end
    end
    %對剩下聚類中心中的第一個進行懲罰
    m=indice(2);
    center(m)=center(m)-learning_rate*abs(random_pixel-center(m))^(-P-2)*(random_pixel-center(m));
    %求能量函數
    dist1=abs(all_pixel-center(indice(1)));
    E_part1=0.5*(dist1'*dist1);
    %去除離像素點最近的聚類中心
    if indice(1)~=1
        center2=[center(1:indice(1)-1);center(indice(1)+1:end)];
    else
        center2=center(indice(1)+1:end);
    end
    %求所有像素距離其他聚類中心的距離之和
    dist2=abs(all_pixel*ones(1,cluster_num-1)-(center2*ones(1,row*col))').^(-P);
    E_part2=2/P*sum(dist2,'all');
    E_all=[E_all;E_part1+E_part2];
    fprintf('第%d次迭代,E=%f\n',i,E_all(i));
end
%分割圖像
distance_result=abs(all_pixel*ones(1,cluster_num)-(center*ones(1,row*col))');
[~,result_indice]=min(distance_result,[],2);
color_level=rand(cluster_num,3);
result=zeros(row*col,1,3);
for i=1:row*col
    result(i,1,:)=color_level(result_indice(i),:);
end
result=reshape(result,row,col,3);
figure(2),imshow(result);
figure(3),plot(E_all);
toc;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章