ドキュメンテーション

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

k-means クラスタリングを使った色ベースのセグメンテーション

この例では、L*a*b* 色空間と k-means クラスタリングを使って自動的に色をセグメント化する方法を示します。

手順 1: イメージの読み取り

hestain.png を読み取ります。これはヘマトキシリンとエオシン (H&E) で染色された組織のイメージです。この染色方法は、病理学者が組織の種類を区別するのに役立ちます。

he = imread('hestain.png');
imshow(he), title('H&E image');
text(size(he,2),size(he,1)+15,...
     'Image courtesy of Alan Partin, Johns Hopkins University', ...
     'FontSize',7,'HorizontalAlignment','right');

手順 2: イメージを RGB 色空間から L*a*b* 色空間に変換

明るさのばらつきを無視した場合に、どのくらいの色を確認できるでしょうか?3 つの色があります。白、青、ピンクです。これらの色を視覚的に簡単に区別できることに注目してください。L*a*b* 色空間 (CIELAB または CIE L*a*b*) を使用すると、このような視覚的差異を定量化できます。

L*a*b* 色空間は CIE XYZ 三刺激値から導出されます。L*a*b* 空間は、輝度レイヤー 'L*'、色が赤-緑の軸に沿って位置する場所を示す色度レイヤー 'a*'、および色が青-黄の軸に沿って位置する場所を示す色度レイヤー 'b*' から構成されます。すべての色情報は、'a*' および 'b*' レイヤーにあります。ユークリッド距離計量を使用して、2 つの色の間の距離を測定できます。

rgb2lab を使用して、イメージを L*a*b* 色空間に変換します。

lab_he = rgb2lab(he);

手順 3: k-means クラスタリングを使用した 'a*b*' 空間の色の分類

クラスタリングはオブジェクトのグループを区分する方法です。k-means クラスタリングは、各オブジェクトを空間配置されたオブジェクトとして取り扱います。これは、各クラスター内のオブジェクトができるだけ互いに近くにあり、他のクラスターのオブジェクトからはできるだけ遠くにある分割を探します。k-means クラスタリングでは、分割するクラスターの数と距離計量を指定し、2 つのオブジェクトが互いにどのくらい近いかを定量化する必要があります。

色情報が 'a*b*' 色空間に存在するので、オブジェクトは 'a*' および 'b*' 値を持つピクセルです。imsegkmeans で使用するために、データをデータ型 single に変換します。imsegkmeans を使用して、オブジェクトを 3 つのクラスターに分類します。

ab = lab_he(:,:,2:3);
ab = im2single(ab);
nColors = 3;
% repeat the clustering 3 times to avoid local minima
pixel_labels = imsegkmeans(ab,nColors,'NumAttempts',3);

入力内のすべてのオブジェクトに対して、imsegkmeans はクラスターに対応するインデックス (ラベル) を返します。イメージ内のすべてのピクセルに、そのピクセル ラベルでラベル付けします。

imshow(pixel_labels,[])
title('Image Labeled by Cluster Index');

手順 4: H&E イメージを色でセグメント化するイメージの作成

pixel_labels を使用して、hestain.png のオブジェクトを色分けできます。この結果、3 つのイメージになります。

mask1 = pixel_labels==1;
cluster1 = he .* uint8(mask1);
imshow(cluster1)
title('Objects in Cluster 1');

mask2 = pixel_labels==2;
cluster2 = he .* uint8(mask2);
imshow(cluster2)
title('Objects in Cluster 2');

mask3 = pixel_labels==3;
cluster3 = he .* uint8(mask3);
imshow(cluster3)
title('Objects in Cluster 3');

手順 5: 細胞核のセグメント化

クラスター 3 には青いオブジェクトが含まれています。紺色と水色のオブジェクトがあることに注目してください。L*a*b* 色空間の 'L*' レイヤーを使用して、水色から紺色を分離します。細胞核は紺色です。

'L*' レイヤーには各色の明度値が含まれていることを思い出してください。このクラスターのピクセルの明度の値を抽出し、imbinarize でグローバルしきい値を使用してそれらの値をしきい値処理します。マスク is_light_blue によって水色のピクセルのインデックスが取得されます。

L = lab_he(:,:,1);
L_blue = L .* double(mask3);
L_blue = rescale(L_blue);
idx_light_blue = imbinarize(nonzeros(L_blue));

青いオブジェクトのマスク mask3 をコピーし、そのマスクから水色のピクセルを削除します。元のイメージに新しいマスクを適用し、結果を表示します。紺色の細胞核のみ表示されます。

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');