이 페이지의 최신 내용은 아직 번역되지 않았습니다. 최신 내용은 영문으로 볼 수 있습니다.

imsegkmeans

K-평균 군집화 기반 영상 분할

설명

예제

L = imsegkmeans(I,k)는 k-평균 군집화를 수행하여 영상 Ik개의 군집으로 분할하고 L에 레이블과 함께 반환합니다.

예제

[L,centers] = imsegkmeans(I,k)는 군집 중심 위치 centers도 반환합니다.

L = imsegkmeans(I,k,Name,Value)는 k-평균 군집화 알고리즘의 특성을 제어하기 위해 이름-값 인수를 사용합니다.

예제

모두 축소

영상을 작업 공간으로 읽어 들입니다.

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

k-평균 군집화를 사용하여 영상을 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-평균 군집화를 사용하여 영상을 2개 영역으로 분할합니다.

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

몇몇 픽셀의 레이블이 잘못되었습니다. 이 예제의 나머지 부분에서는 각 픽셀에 대한 정보를 추가하여 k-평균 분할을 개선하는 방법을 보여줍니다.

영상에 각 픽셀의 이웃에 있는 텍스처에 대한 정보를 추가합니다. 텍스처 정보를 얻으려면 가보르 필터 세트를 사용하여 영상의 회색조 버전을 필터링하십시오.

가보르 필터 24개의 세트를 만듭니다. 6개 파장과 4개 방향을 포함합니다.

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-평균 군집화 알고리즘에서 공간적으로 가까운 픽셀을 그룹화합니다.

입력 영상에 있는 모든 픽셀의 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-평균 군집화를 사용하여 영상을 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-평균 군집화를 사용하여 영상을 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);

입력 데이터를 평균 0과 단위 분산을 갖도록 정규화합니다. 'NormalizeInput'과 함께 true 또는 false가 쉼표로 구분되어 지정됩니다. true를 지정할 경우 imsegkmeans는 입력값의 각 채널을 개별적으로 정규화합니다.

새 초기 군집 중심 위치를 사용하여 군집화 과정을 반복할 횟수로, 'NumAttempts'와 함께 양의 정수가 쉼표로 구분되어 지정됩니다.

최대 반복 횟수로, 'MaxIterations'와 함께 양의 정수가 쉼표로 구분되어 지정됩니다.

정확도 임계값으로, 'Threshold'와 함께 양수가 쉼표로 구분되어 지정됩니다. 연속적인 반복에서 각 군집 중심이 임계값보다 적게 이동하면 이 알고리즘은 중지합니다.

출력 인수

모두 축소

레이블 행렬로, 양의 정수로 구성된 행렬로 지정됩니다. 레이블 1이 지정된 픽셀은 첫 번째 군집에, 레이블 2 픽셀은 두 번째 군집에 속하는 식으로 k개의 군집 각각에 대해 분류됩니다. L은 영상 I와 처음 2개 차원이 같습니다. L의 클래스는 군집 개수에 따라 달라집니다.

L의 클래스군집 개수
'uint8'k <= 255
'uint16'256 <= k <= 65535
'uint32'65536 <= k <= 2^32-1
'double'2^32 <= k

군집 중심 위치이며, kxc 크기의 숫자형 행렬로 반환됩니다. 여기서 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에 개발됨