天天看點

使用 Kmeans聚類實作顔色的分割

之前分享過kmeans算法(傳送門:​​資料挖掘算法—K-Means算法​​),這期分享一下使用 Kmeans聚類實作顔色的分割,使用 L*a*b* 顔色空間和 K 均值聚類自動分割顔色。

步驟 1:讀取圖像

讀取hestain.png,

he = imread('hestain.png');imshow(he), title('H&E image');      
使用 Kmeans聚類實作顔色的分割

步驟 2:将圖像從 RGB 顔色空間轉換為 L*a*b* 顔色空間

L*a*b* 顔色空間(也稱為 CIELAB 或 CIE L*a*b*)能夠量化視覺差異。

L*a*b* 顔色空間是從 CIE XYZ 三色值派生的。L*a*b* 空間包含光度層 'L*'、色度層 'a*'(表示顔色落在沿紅-綠軸的位置)和色度層 'b*'(表示顔色落在沿藍-黃軸的位置)。所有顔色資訊都在 'a*' 和 'b*' 層。可以使用歐幾裡德距離度量來測量兩種顔色之間的差異。

使用 rgb2lab 将圖像轉換為 L*a*b* 顔色空間。

lab_he      
使用 Kmeans聚類實作顔色的分割

步驟 3:用 K 均值聚類對基于 'a*b*' 空間的顔色進行分類

聚類是一種分離對象組的方法。K 均值聚類将每個對象視為在空間中有一個位置。它将對象劃分為若幹分區,使每個簇中的對象盡可能彼此靠近,并盡可能遠離其他簇中的對象。K 均值聚類要求您指定要劃分的簇數和用于量化兩個對象之間距離的距離度量。

由于顔色資訊基于 'a*b*' 顔色空間,是以您的對象是具有 'a*' 和 'b*' 值的像素。将資料轉換為資料類型 single,以便與 imsegkmeans 結合使用。使用 imsegkmeans 對對象進行聚類以分為三個簇。

ab = lab_he(:,:,2:3);ab = im2single(ab);nColors = 3;% 重複三次聚類,避免局部最優pixel_labels = imsegkmeans(ab,nColors,'NumAttempts',3);      

對于輸入中的每個對象,imsegkmeans 會傳回一個對應于簇的索引或标簽。用像素的标簽标注圖像中的每個像素。

imshow(pixel_labels,[])title('Image Labeled by Cluster Index');      
使用 Kmeans聚類實作顔色的分割

步驟 4:建立按顔色分割 H&E 圖像的圖像

使用 pixel_labels,可以按顔色分離 hestain.png 中的對象,這将産生三個圖像。

mask1 = pixel_labels==1;cluster1 = he .* uint8(mask1);imshow(cluster1)title('Objects in Cluster 1');      
使用 Kmeans聚類實作顔色的分割
mask2 = pixel_labels==2;cluster2 = he .* uint8(mask2);imshow(cluster2)title('Objects in Cluster 2');      
使用 Kmeans聚類實作顔色的分割
mask3 = pixel_labels==3;cluster3 = he .* uint8(mask3);imshow(cluster3)title('Objects in Cluster 3');      
使用 Kmeans聚類實作顔色的分割

步驟 5:分割核

簇 3 包含藍色對象。請注意,有深藍色和淺藍色對象。您可以使用 L*a*b* 顔色空間中的 'L*' 層來分離深藍色和淺藍色。細胞核為深藍色。

L = lab_he(:,:,1);L_blueL_blueidx_light_blue      
blue_idx = find(mask3);mask_dark_blue = mask3;mask_dark_blue(blue_idx(idx_light_blue)) = 0;
blue_nuclei = he .* uint8(mask_dark_blue);imshow(blue_nuclei)title('Blue Nuclei');      

繼續閱讀