ドキュメンテーション

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

ガボール フィルターを使用したテクスチャのセグメンテーション

この例では、テクスチャに基づいて領域を識別するためにテクスチャのセグメンテーションを使用する方法を示します。目標は犬と浴室の床をセグメント化することです。浴室の床の規則正しい周期パターンと犬の毛の均一で滑らかなテクスチャの違いにより、セグメンテーションは一目瞭然です。

ガボール フィルターは哺乳類の視覚システムの単純細胞に対する合理的なモデルであることが実験からわかっています。そのため、ガボール フィルターはヒトがテクスチャをどのように区別するかを示す優れたモデルと考えられており、その結果、テクスチャを認識するアルゴリズムを設計するうえで役立つモデルになります。この例では、(A. K. Jain and F. Farrokhnia, "Unsupervised Texture Segmentation Using Gabor Filters",1991) に記載されている基本的なアプローチを使用してテクスチャをセグメンテーションします。

入力イメージの読み取りと表示

入力イメージを読み取って表示します。この例では、実行を高速化するためにイメージを縮小しています。

A = imread('kobi.png');
A = imresize(A,0.25);
Agray = rgb2gray(A);
figure
imshow(A)

ガボール フィルターの配列の設計

さまざまな周波数と方向に調整したガボール フィルターの配列を設計します。周波数と方向の組み合わせは、多様なほぼ直交する、周波数と方向の情報のサブセットを入力イメージで局所的に使うように設計されています。方向は、0 ~ 150 度の範囲を 30 度のステップの一定間隔でサンプリングします。波長は、4/sqrt(2) から入力イメージの斜辺の長さまで 2 のべき乗で増加させながらサンプリングします。こうした周波数と方向の組み合わせは、「はじめに」で引用した [Jain,1991] から導き出されています。

imageSize = size(A);
numRows = imageSize(1);
numCols = imageSize(2);

wavelengthMin = 4/sqrt(2);
wavelengthMax = hypot(numRows,numCols);
n = floor(log2(wavelengthMax/wavelengthMin));
wavelength = 2.^(0:(n-2)) * wavelengthMin;

deltaTheta = 45;
orientation = 0:deltaTheta:(180-deltaTheta);

g = gabor(wavelength,orientation);

ソース イメージからガボール振幅の特徴を抽出します。ガボール フィルターを取り扱う場合、各フィルターの振幅応答を使用するのが一般的です。ガボール振幅応答は「ガボール エネルギー」と呼ばれることもあります。gabormag(:,:,ind) で示される M 行 N 列のガボール振幅の各出力イメージは、対応するガボール フィルター g(ind) の出力です。

gabormag = imgaborfilt(Agray,g);

ガボールの特徴を得るためのガボール振幅イメージの後処理

ガボール振幅応答を分類用の特徴として使用するには、複数の後処理が必要になります。この後処理にはガウス平滑化に加え、追加的な空間情報を特徴セットに追加する、関数 pcakmeans で必要となる形式に特徴セットを整形する、共通の分散と平均値に特徴情報を正規化する、などがあります。

各ガボール振幅イメージには、良好にセグメント化された一定テクスチャの領域内でも、いくつかの局所的なばらつきが含まれています。これらの局所的なばらつきによってセグメンテーションの精度が損なわれます。単純なガウス ローパス フィルターでガボール振幅情報を平滑化すると、これらのばらつきを補正できます。各特徴を抽出したガボール フィルターに適合するシグマを選びます。また、平滑化項 K を導入し、ガボール振幅応答に適用する平滑化の量を制御します。

for i = 1:length(g)
    sigma = 0.5*g(i).Wavelength;
    K = 3;
    gabormag(:,:,i) = imgaussfilt(gabormag(:,:,i),K*sigma); 
end

分類用のガボール特徴セットを作成する場合、X と Y の空間位置情報のマップを追加すると役立ちます。この追加情報により空間的に近接したグループを優先する分類が可能になります。

X = 1:numCols;
Y = 1:numRows;
[X,Y] = meshgrid(X,Y);
featureSet = cat(3,gabormag,X);
featureSet = cat(3,featureSet,Y);

データを整形し、関数 kmeans で必要となる形式の行列 X にします。イメージ グリッド内の各ピクセルは個別のデータ点であり、変数 featureSet の各平面は個別の特徴になります。この例には、ガボール フィルター バンクにある各フィルターの個別の特徴に加え、前の手順で追加した空間情報の 2 つの特徴が存在します。全体では、入力イメージのピクセルごとにガボールの特徴が 24 個、空間的な特徴が 2 個となります。

numPoints = numRows*numCols;
X = reshape(featureSet,numRows*numCols,[]);

ゼロ平均、単位分散に特徴を正規化します。

X = bsxfun(@minus, X, mean(X));
X = bsxfun(@rdivide,X,std(X));

特徴セットを可視化します。ガボール振幅の特徴がどのように見えるかを把握するために、主成分分析を使用して、入力イメージ内の各ピクセルの 26 次元表現からピクセルごとの 1 次元強度値に変換することができます。

coeff = pca(X);
feature2DImage = reshape(X*coeff(:,1),numRows,numCols);
figure
imshow(feature2DImage,[])

このイメージを明確にセグメンテーションするのに十分な分散がガボール特徴情報にあることが、可視化によって明らかになりました。犬と床のテクスチャの差により、床と比較して犬が非常に暗く表示されています。

kmeans を使用したガボール テクスチャの特徴の分類

目的関数を最小化する平均値を求める場合、局所的最小値を避けるために k-means クラスタリングを 5 回繰り返します。この例で前提とする唯一の情報は、セグメント化するイメージ内に独立したテクスチャ領域がいくつ存在するかです。この場合には、独立した領域が 2 つ存在します。例のこの部分には、Statistics and Machine Learning Toolbox™ が必要です。

L = kmeans(X,2,'Replicates',5);

label2rgb を使用してセグメンテーションを可視化します。

L = reshape(L,[numRows numCols]);
figure
imshow(label2rgb(L))

imshowpair を使用してセグメント化されたイメージを可視化します。ラベル行列 L に関連付けられたマスク BW から作成される前景と背景のイメージを確認します。

Aseg1 = zeros(size(A),'like',A);
Aseg2 = zeros(size(A),'like',A);
BW = L == 2;
BW = repmat(BW,[1 1 3]);
Aseg1(BW) = A(BW);
Aseg2(~BW) = A(~BW);
figure
imshowpair(Aseg1,Aseg2,'montage');