Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

imsegkmeans

k-means クラスタリング ベースのイメージ セグメンテーション

説明

L = imsegkmeans(I,k) は、k-means クラスタリングを実行してイメージ Ik 個のクラスターにセグメント化し、セグメント化されたラベル付き出力を L に返します。

[L,centers] = imsegkmeans(I,k) は、クラスターの重心位置 centers も返します。

L = imsegkmeans(I,k,Name,Value) は、k-means クラスタリング アルゴリズムの特性を制御する名前と値の引数を使用します。

すべて折りたたむ

イメージをワークスペースに読み取ります。

I = imread("cameraman.tif");
imshow(I)
title("Original Image")

Figure contains an axes object. The axes object with title Original Image contains an object of type image.

k-means クラスタリングを使用してイメージを 3 つの領域にセグメント化します。

[L,Centers] = imsegkmeans(I,3);
B = labeloverlay(I,L);
imshow(B)
title("Labeled Image")

Figure contains an axes object. The axes object with title Labeled Image contains an object of type image.

イメージをワークスペースに読み取ります。例の実行を高速化するためにイメージ サイズを縮小します。

RGB = imread("kobi.png");
RGB = imresize(RGB,0.5);
imshow(RGB)

Figure contains an axes object. The axes object contains an object of type image.

k-means クラスタリングを使用してイメージを 2 つの領域にセグメント化します。

L = imsegkmeans(RGB,2);
B = labeloverlay(RGB,L);
imshow(B)
title("Labeled Image")

Figure contains an axes object. The axes object with title Labeled Image contains an object of type image.

複数のピクセルが誤ってラベル付けされています。この例の残りの部分では、各ピクセルに関する情報を補って k-means セグメンテーションを改善する方法を説明します。

イメージに各ピクセルの近傍のテクスチャに関する情報を補います。テクスチャ情報を取得するために、一連のガボール フィルターを使用してイメージのグレースケール バージョンをフィルター処理します。

6 つの波長と 4 つの方向をカバーする一連の 24 個のガボール フィルターを作成します。

wavelength = 2.^(0:5) * 3;
orientation = 0:45:135;
g = gabor(wavelength,orientation);

イメージをグレースケールに変換します。

I = im2gray(im2single(RGB));

ガボール フィルターを使用してグレースケール イメージをフィルター処理します。24 個のフィルター処理されたイメージをモンタージュに表示します。

gabormag = imgaborfilt(I,g);
montage(gabormag,"Size",[4 6])

Figure contains an axes object. The axes object contains an object of type image.

フィルター処理された各イメージを平滑化し、局所的なばらつきを除去します。平滑化されたイメージをモンタージュに表示します。

for i = 1:length(g)
    sigma = 0.5*g(i).Wavelength;
    gabormag(:,:,i) = imgaussfilt(gabormag(:,:,i),3*sigma); 
end
montage(gabormag,"Size",[4 6])

Figure contains an axes object. The axes object contains an object of type image.

各ピクセルに関する情報に空間位置情報を補います。この追加情報により、k-means クラスタリング アルゴリズムは空間的に近接したグループを優先することができます。

入力イメージにあるすべてのピクセルの x 座標と y 座標を取得します。

nrows = size(RGB,1);
ncols = size(RGB,2);
[X,Y] = meshgrid(1:ncols,1:nrows);

各ピクセルに関する強度情報、近傍テクスチャ情報および空間情報を連結します。

この例の場合、特徴セットには元のカラー イメージ RGB ではなく強度イメージ I が含まれています。犬の毛の黄色がタイルの黄色の色相と類似しているため、色情報は特徴セットから省略されています。カラー チャネルからは、クリーンなセグメンテーションを得るための犬と背景に関する特徴的な情報が十分に得られません。

featureSet = cat(3,I,gabormag,X,Y);

k-means クラスタリングと補足した特徴セットを使用してイメージを 2 つの領域にセグメント化します。

L2 = imsegkmeans(featureSet,2,"NormalizeInput",true);
C = labeloverlay(RGB,L2);
imshow(C)
title("Labeled Image with Additional Pixel Information")

Figure contains an axes object. The axes object with title Labeled Image with Additional Pixel Information contains an object of type image.

イメージをワークスペースに読み取ります。

I = imread("peppers.png");
imshow(I)
title("Original Image")

Figure contains an axes object. The axes object with title Original Image contains an object of type image.

k-means クラスタリングを使用してイメージを 50 個の領域にセグメント化します。ラベル行列 L とクラスター重心位置 C を返します。クラスター重心位置は 50 個の各色の RGB 値です。

[L,C] = imsegkmeans(I,50);

ラベル行列を RGB イメージに変換します。クラスター重心位置 C を新しいイメージのカラーマップとして指定します。

J = label2rgb(L,im2double(C));

量子化後のイメージを表示します。

imshow(J)
title("Color Quantized Image")

Figure contains an axes object. The axes object with title Color Quantized Image contains an object of type image.

元のイメージと圧縮されたイメージをファイルに書き込みます。量子化後のイメージ ファイルのサイズは、元のイメージ ファイルの約 1/4 になります。

imwrite(I,"peppersOriginal.png");
imwrite(J,"peppersQuantized.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");

Figure contains an axes object. The axes object with title H&E image contains 2 objects of type image, text.

関数 rgb2lab を使用して、イメージを L*a*b* 色空間に変換します。L*a*b* 色空間は、イメージの輝度と色を分離します。このため、明るさに関係なく、色によって領域をセグメント化することが容易になります。

lab_he = rgb2lab(he);

色情報のみを使用してイメージをセグメント化するには、イメージを lab_he の a* および b* の値に制限します。imsegkmeans で使用するためにイメージをデータ型 single に変換します。関数 imsegkmeans を使用してイメージを 3 つの領域にセグメント化します。

ab = lab_he(:,:,2:3);
ab = im2single(ab);
numColors = 3;
L2 = imsegkmeans(ab,numColors);

ラベル イメージを、元のイメージの上にオーバーレイとして表示します。このラベル イメージでは、白、青紫、ピンクで染色された組織の領域が分離されています。

B2 = labeloverlay(he,L2);
imshow(B2)
title("Labeled Image a*b*")

Figure contains an axes object. The axes object with title Labeled Image a*b* contains an object of type image.

入力引数

すべて折りたたむ

セグメント化するイメージ。2 次元グレースケール イメージ、2 次元カラー イメージまたは 2 次元マルチスペクトル イメージとして指定します。元のイメージがデータ型 double の場合は、関数 im2single を使用してイメージをデータ型 single に変換します。

データ型: single | int8 | int16 | uint8 | uint16

作成するクラスターの数。正の整数として指定します。

名前と値の引数

オプションの引数のペアを Name1=Value1,...,NameN=ValueN として指定します。ここで、Name は引数名で、Value は対応する値です。名前と値の引数は他の引数の後に指定しなければなりませんが、ペアの順序は重要ではありません。

例: imsegkmeans(I,k,NumAttempts=5) はクラスタリング処理を 5 回繰り返します。

R2021a より前では、コンマを使用して名前と値をそれぞれ区切り、Name を引用符で囲みます。

例: imsegkmeans(I,k,"NumAttempts",5) はクラスタリング処理を 5 回繰り返します。

入力データのゼロ平均と単位分散への正規化。数値または logical の 1 (true) か 0 (false) として指定します。true を指定した場合、imsegkmeans は入力の各チャネルを個別に正規化します。

新しい初期クラスター重心位置を使用してクラスタリング処理を繰り返す回数。正の整数として指定します。

最大反復回数。正の整数として指定します。

精度のしきい値。正の数値として指定します。連続する反復においてクラスターの各中心の移動距離がしきい値より小さくなると、アルゴリズムは停止します。

出力引数

すべて折りたたむ

ラベル行列。正の整数の行列として指定します。k 個の各クラスターについて、ラベル 1 のピクセルは最初のクラスターに属し、ラベル 2 は 2 番目のクラスターに属する、というようになります。L の最初の 2 つの次元は、イメージ I と同じです。L のデータ型は、クラスターの数によって異なります。

L のデータ型クラスターの数
uint8k <= 255
uint16256 <= k <= 65535
uint3265536 <= k <= 2^32-1
double2^32 <= k

クラスター重心位置。k 行 c 列の数値行列として返されます。ここで、k はクラスターの数、c はチャネルの数です。centers はイメージ I と同じデータ型です。

ヒント

  • この関数では、再現性のある結果が得られます。指定する入力引数が同じ場合、複数回実行しても出力は変わりません。

  • 関数 imsegkmeans は、サポートされているすべての色空間の入力イメージを受け入れます。異なる色空間を使用すると、異なる結果が生成されます。入力イメージに対して満足のいく結果が得られない場合は、別の色空間の試行を検討してください。MATLAB® の色空間の詳細については、異なる色空間間での変換についてを参照してください。

  • データ型 double のイメージに対して k-means クラスタリングを実行するには、関数 im2single を使用してイメージをデータ型 single に変換します。double 型の入力データを必要とするアプリケーションについては、関数 kmeans (Statistics and Machine Learning Toolbox) を参照してください。

参照

[1] Arthur, David, and Sergei Vassilvitskii. “K-Means++: The Advantages of Careful Seeding.” In Proceedings of the Eighteenth Annual ACM-SIAM Symposium on Discrete Algorithms, 1027–35. SODA ’07. USA: Society for Industrial and Applied Mathematics, 2007.

バージョン履歴

R2018b で導入