このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
imsegkmeans
k-means クラスタリング ベースのイメージ セグメンテーション
説明
例
k-means クラスタリングを使用したグレースケール イメージのセグメント化
イメージをワークスペースに読み取ります。
I = imread("cameraman.tif"); imshow(I) title("Original Image")
k-means クラスタリングを使用してイメージを 3 つの領域にセグメント化します。
[L,Centers] = imsegkmeans(I,3);
B = labeloverlay(I,L);
imshow(B)
title("Labeled Image")
テクスチャ情報と空間情報を使用した k-means セグメンテーションの改善
イメージをワークスペースに読み取ります。例の実行を高速化するためにイメージ サイズを縮小します。
RGB = imread("kobi.png");
RGB = imresize(RGB,0.5);
imshow(RGB)
k-means クラスタリングを使用してイメージを 2 つの領域にセグメント化します。
L = imsegkmeans(RGB,2);
B = labeloverlay(RGB,L);
imshow(B)
title("Labeled 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])
フィルター処理された各イメージを平滑化し、局所的なばらつきを除去します。平滑化されたイメージをモンタージュに表示します。
for i = 1:length(g) sigma = 0.5*g(i).Wavelength; gabormag(:,:,i) = imgaussfilt(gabormag(:,:,i),3*sigma); end montage(gabormag,"Size",[4 6])
各ピクセルに関する情報に空間位置情報を補います。この追加情報により、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")
k-means セグメンテーションを使用したカラー イメージの圧縮
イメージをワークスペースに読み取ります。
I = imread("peppers.png"); imshow(I) title("Original 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")
元のイメージと圧縮されたイメージをファイルに書き込みます。量子化後のイメージ ファイルのサイズは、元のイメージ ファイルの約 1/4 になります。
imwrite(I,"peppersOriginal.png"); imwrite(J,"peppersQuantized.png");
代替の色空間を使用した k-means セグメンテーションの改善
イメージをワークスペースに読み取ります。このイメージには、ヘマトキシリンとエオシン (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");
関数 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*")
入力引数
I
— セグメント化するイメージ
2 次元グレースケール イメージ | 2 次元カラー イメージ | 2 次元マルチスペクトル イメージ
セグメント化するイメージ。2 次元グレースケール イメージ、2 次元カラー イメージまたは 2 次元マルチスペクトル イメージとして指定します。元のイメージがデータ型 double
の場合は、関数 im2single
を使用してイメージをデータ型 single
に変換します。
データ型: single
| int8
| int16
| uint8
| uint16
k
— クラスターの数
正の整数
作成するクラスターの数。正の整数として指定します。
名前と値の引数
オプションの引数のペアを Name1=Value1,...,NameN=ValueN
として指定します。ここで、Name
は引数名で、Value
は対応する値です。名前と値の引数は他の引数の後に指定しなければなりませんが、ペアの順序は重要ではありません。
例: imsegkmeans(I,k,NumAttempts=5)
はクラスタリング処理を 5 回繰り返します。
R2021a より前では、コンマを使用して名前と値をそれぞれ区切り、Name
を引用符で囲みます。
例: imsegkmeans(I,k,"NumAttempts",5)
はクラスタリング処理を 5 回繰り返します。
NormalizeInput
— 入力データの正規化
true
または 1
(既定値) | false
または 0
入力データのゼロ平均と単位分散への正規化。数値または logical の 1
(true
) か 0
(false
) として指定します。true
を指定した場合、imsegkmeans
は入力の各チャネルを個別に正規化します。
NumAttempts
— クラスタリング処理を繰り返す回数
3
(既定値) | 正の整数
新しい初期クラスター重心位置を使用してクラスタリング処理を繰り返す回数。正の整数として指定します。
MaxIterations
— 最大反復回数
100
(既定値) | 正の整数
最大反復回数。正の整数として指定します。
Threshold
— 精度のしきい値
1e-4
(既定値) | 正の数値
精度のしきい値。正の数値として指定します。連続する反復においてクラスターの各中心の移動距離がしきい値より小さくなると、アルゴリズムは停止します。
出力引数
centers
— クラスター重心位置
数値行列
クラスター重心位置。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 で導入
参考
アプリ
関数
imsegkmeans3
|gabor
|imgaborfilt
|labeloverlay
|label2rgb
|superpixels
|lazysnapping
|watershed
|labelmatrix
MATLAB コマンド
次の MATLAB コマンドに対応するリンクがクリックされました。
コマンドを MATLAB コマンド ウィンドウに入力して実行してください。Web ブラウザーは MATLAB コマンドをサポートしていません。
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list:
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)