Main Content

가버 필터를 사용한 텍스처 분할

이 예제에서는 텍스처 분할을 사용하여 영역의 텍스처를 기준으로 영역을 식별하는 방법을 보여줍니다. 목표는 화장실 바닥에서 개를 분할하는 것입니다. 화장실 바닥의 규칙적이고 주기적 패턴의 텍스처와 개털의 규칙적이고 부드러운 텍스처 간에는 차이가 있기 때문에 시각적으로 명확하게 분할할 수 있습니다.

가버 필터가 포유류 시각 체계의 단순 세포를 적절하게 모델링한 필터라는 사실은 실험을 통해 밝혀진 바 있습니다. 이런 이유로 가버 필터는 사람이 텍스처를 구분하는 방식을 잘 보여주는 모델로 여겨지며, 따라서 텍스처 인식 알고리즘을 설계할 때 유용하게 사용할 수 있는 모델입니다. 이 예제에서는 참고 문헌(A. K. Jain and F. Farrokhnia, "Unsupervised Texture Segmentation Using Gabor Filters",1991)에서 설명하는 기본적인 방법을 사용하여 텍스처 분할을 수행합니다.

입력 영상을 읽어 들여 표시하기

입력 영상을 읽어 들여 표시합니다. 이 예제에서는 예제가 더 빠르게 실행될 수 있도록 영상의 크기를 축소합니다.

A = imread("kobi.png");
A = imresize(A,0.25);
Agray = im2gray(A);
imshow(A)

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

가버 필터로 구성된 배열 설계하기

다양한 주파수와 방향에 맞게 조정된 가버 필터로 구성된 배열을 설계합니다. 주파수 및 방향 세트는 입력 영상에서 대략적으로 직교하는 다양한 주파수 및 방향 정보 서브셋을 국소화하도록 설계되었습니다. [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)의 MxN 가버 크기 출력 영상은 대응하는 가버 필터 g(ind)의 출력값입니다.

gabormag = imgaborfilt(Agray,g);

가버 크기 영상을 가버 특징으로 후처리하기

가버 크기 응답을 분류를 위한 특징으로 사용하려면 몇 가지 후처리가 필요합니다. 이러한 후처리에는 가우스 평활화 적용, 특징 세트에 공간 정보 추가, 특징 세트를 pca 함수와 kmeans 함수에 적합한 형태로 변경, 특징 정보를 일반적인 분산과 평균으로 정규화하는 작업이 포함됩니다.

각 가버 크기 영상은 심지어 분할 처리가 잘 된 균일한 텍스처 내에서도 국소적 변화를 포함하고 있습니다. 이러한 국소적 변화로 인해 해당 분할이 버려질 수 있습니다. 간단한 가우스 저역통과 필터링을 사용하여 가버 크기 정보를 평활화하면 이러한 국소적 변화를 보정할 수 있습니다. 여기서는 각 특징을 추출한 가버 필터와 매칭되는 시그마를 선택합니다. 가버 크기 응답에 평활화를 얼마나 적용할지 조절하는 평활화 항 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의 각 평면은 개별 특징입니다. 이 예제에서는 가버 필터 뱅크의 각 필터마다 개별 특징이 있으며, 직전 단계에서 추가한 공간 정보의 특징 두 개가 더 있습니다. 모두 합치면 입력 영상의 각 픽셀마다 24개의 가버 특징과 2개의 공간 특징이 있습니다.

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

특징이 평균 0과 단위 분산을 갖도록 정규화합니다.

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

특징 세트를 시각화합니다. 가버 크기 특징이 어떻게 생겼는지 가늠해 보려면 주성분 분석을 사용하여 입력 영상에서 26차원으로 표현된 각 픽셀을 1차원 명암 값으로 전환해 볼 수 있습니다.

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

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

시각화한 결과를 보면 이 가버 특징 정보에 영상에 대한 양호한 분할을 얻기에 충분한 분산이 있음을 알 수 있습니다. 개와 바닥의 텍스처 차이로 인해 바닥과 비교했을 때 개가 매우 어둡게 표시됩니다.

kmeans를 사용하여 가버 텍스처 특징 분류하기

목적 함수를 최소화하는 평균을 찾을 때 국소 최솟값을 방지하기 위해 k-평균 군집화를 다섯 번 반복합니다. 이 예제에서 가정하고 있는 유일한 사전 정보는 분할되는 영상에 존재하는 서로 다른 텍스처 영역의 개수입니다. 이 경우 두 개의 서로 다른 영역이 있습니다. 예제의 이 부분을 수행하려면 Statistics and Machine Learning Toolbox™가 필요합니다.

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

label2rgb를 사용하여 분할을 시각화합니다.

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

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

분할을 시각화합니다. 레이블 행렬 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);
montage({Aseg1,Aseg2});

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

참고 문헌

[1] Jain, Anil K., and Farshid Farrokhnia. "Unsupervised Texture Segmentation Using Gabor Filters." Pattern Recognition 24, no. 12 (January 1991): 1167–86. https://doi.org/10.1016/0031-3203(91)90143-S.

참고 항목

|