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

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

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

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

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 = rgb2gray(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')

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

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

入力引数

すべて折りたたむ

セグメント化するイメージ。2 次元グレースケール イメージ、2 次元カラー イメージまたは 2 次元マルチスペクトル イメージとして指定します。

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

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

名前と値のペアの引数

オプションの引数 Name,Value のコンマ区切りペアを指定します。Name は引数名で、Value は対応する値です。Name は引用符で囲まなければなりません。Name1,Value1,...,NameN,ValueN のように、複数の名前と値のペアの引数を、任意の順番で指定できます。

例: L = imsegkmeans(I,5,'NumAttempts',5);

入力データのゼロ平均と単位分散への正規化。'NormalizeInput'true または false で構成されるコンマ区切りのペアとして指定します。true を指定した場合、imsegkmeans は入力の各チャネルを個別に正規化します。

新しい初期クラスター重心位置を使用してクラスタリング処理を繰り返す回数。'NumAttempts' と正の整数で構成されるコンマ区切りのペアとして指定します。

最大反復回数。'MaxIterations' と正の整数で構成されるコンマ区切りのペアとして指定します。

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

出力引数

すべて折りたたむ

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

L のクラスクラスターの数
'uint8'k <= 255
'uint16'256 <= k <= 65535
'uint32'65536 <= k <= 2^32-1
'double'2^32 <= k

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

ヒント

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

参照

[1] Arthur, D. and S. Vassilvitskii. "k-means++: The Advantages of Careful Seeding." SODA '07: Proceedings of the Eighteenth Annual ACM-SIAM Symposium on Discrete Algorithms. New Orleans, LA, January 2007, pp. 1027–1035.

R2018b で導入