ドキュメンテーション センター

  • 評価版
  • 製品アップデート

このページは前リリースの情報です。該当の英語のページはこのリリースで更新されています。このリリースの英語のドキュメンテーションを参照するには、言語設定を United States に変更してください。

K-Means クラスタリングを使った色ベースのセグメント化

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

この例には、Statistics Toolbox™ が必要です。

手順 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 つの色の間の距離を測定できます。

makecform および applycform を使用して、イメージを L*a*b* 色空間に変換します。

cform = makecform('srgb2lab');
lab_he = applycform(he,cform);

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

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

色情報が 'a*b*' 空間に存在するので、オブジェクトは 'a*' および 'b*' 値をもつピクセルです。kmeans を使用して、オブジェクトをユークリッド距離計量を使用する 3 つのクラスターに分類します。

ab = double(lab_he(:,:,2:3));
nrows = size(ab,1);
ncols = size(ab,2);
ab = reshape(ab,nrows*ncols,2);

nColors = 3;
% repeat the clustering 3 times to avoid local minima
[cluster_idx cluster_center] = kmeans(ab,nColors,'distance','sqEuclidean', ...
                                      'Replicates',3);

手順 4: KMEANS の結果を使用したイメージの全ピクセルのラベル付け

入力内のすべてのオブジェクトに対して、kmeans はクラスターに対応するインデックスを返します。kmeans からの cluster_center 出力は、この例で後ほど使用されます。イメージ内のすべてのピクセルに、その cluster_index でラベル付けします。

pixel_labels = reshape(cluster_idx,nrows,ncols);
imshow(pixel_labels,[]), title('image labeled by cluster index');

手順 5: H&E イメージを色で区分するイメージの作成

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

segmented_images = cell(1,3);
rgb_label = repmat(pixel_labels,[1 1 3]);

for k = 1:nColors
    color = he;
    color(rgb_label ~= k) = 0;
    segmented_images{k} = color;
end

imshow(segmented_images{1}), title('objects in cluster 1');

imshow(segmented_images{2}), title('objects in cluster 2');

imshow(segmented_images{3}), title('objects in cluster 3');

手順 6: 個別イメージへの細胞核のセグメント化

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

'L*' レイヤーには各色の輝度値が含まれていることを思い出してください。青いオブジェクトが含まれているクラスターを探します。このクラスターのピクセルの輝度値を抽出し、im2bw を使用してそれらの値をしきい値処理します。

kmeans は毎回同じ cluster_idx 値を返さないため、青いオブジェクトを含むクラスターのインデックスをプログラムで決定しなければなりません。これは cluster_center 値を使用して行えます。この値は、各クラスターの平均 'a*' および 'b*' 値を含んでいます。青いクラスターには最小の cluster_center 値 (実験的に決定される) があります。

mean_cluster_value = mean(cluster_center,2);
[tmp, idx] = sort(mean_cluster_value);
blue_cluster_num = idx(1);

L = lab_he(:,:,1);
blue_idx = find(pixel_labels == blue_cluster_num);
L_blue = L(blue_idx);
is_light_blue = im2bw(L_blue,graythresh(L_blue));

マスク is_light_blue を使用して、青い細胞核に属するピクセルにラベルを付けます。次に、別のイメージで青い細胞核を表示します。

nuclei_labels = repmat(uint8(0),[nrows ncols]);
nuclei_labels(blue_idx(is_light_blue==false)) = 1;
nuclei_labels = repmat(nuclei_labels,[1 1 3]);
blue_nuclei = he;
blue_nuclei(nuclei_labels ~= 1) = 0;
imshow(blue_nuclei), title('blue nuclei');

この情報は役に立ちましたか?