Main Content

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

Figure contains an axes object. The axes object with title Original Image contains an object of type image.

k-평균 군집화를 사용하여 영상을 3개 영역으로 분할합니다.

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

Figure contains an axes object. The axes object with title Labeled Image contains an object of type image.

영상을 작업 공간으로 읽어 들입니다. 더 빨리 실행되도록 영상 크기를 줄입니다.

RGB = imread("kobi.png");
RGB = imresize(RGB,0.5);
imshow(RGB)

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

k-평균 군집화를 사용하여 영상을 2개 영역으로 분할합니다.

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

Figure contains an axes object. The axes object with title Labeled Image contains an object of type image.

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

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

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

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

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

국소 변형을 제거하기 위해 각 필터링된 영상을 평활화합니다. 평활화된 영상을 몽타주에 표시합니다.

for i = 1:length(g)
    sigma = 0.5*g(i).Wavelength;
    gabormag(:,:,i) = imgaussfilt(gabormag(:,:,i),3*sigma); 
end
montage(gabormag,"Size",[4 6])

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

각 픽셀에 대한 정보에 공간 위치 정보를 추가합니다. 이 추가 정보가 있으면 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")

Figure contains an axes object. The axes object with title Labeled Image with Additional Pixel Information contains an object of type image.

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

I = imread("peppers.png");
imshow(I)
title("Original Image")

Figure contains an axes object. The axes object with title Original Image contains an object of type 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")

Figure contains an axes object. The axes object with title Color Quantized Image contains an object of type image.

원본 영상과 압축된 영상을 파일에 저장합니다. 양자화된 영상 파일의 크기는 대략 원본 영상 파일 크기의 1/4입니다.

imwrite(I,"peppersOriginal.png");
imwrite(J,"peppersQuantized.png");

영상을 작업 공간으로 읽어 들입니다. 영상에는 헤마톡실린과 에오신(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");

Figure contains an axes object. The axes object with title H&E image contains 2 objects of type image, text.

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*")

Figure contains an axes object. The axes object with title Labeled Image a*b* contains an object of type image.

입력 인수

모두 축소

분할할 영상으로, 2차원 회색조 영상, 2차원 컬러 영상 또는 2차원 다중분광 영상으로 지정됩니다. 원래 영상이 double형이면 im2single 함수를 사용하여 영상을 single형으로 변환합니다.

데이터형: single | int8 | int16 | uint8 | uint16

생성할 군집의 개수로, 양의 정수로 지정됩니다.

이름-값 인수

선택적 인수 쌍을 Name1=Value1,...,NameN=ValueN으로 지정합니다. 여기서 Name은 인수 이름이고 Value는 대응값입니다. 이름-값 인수는 다른 인수 뒤에 와야 하지만, 인수 쌍의 순서는 상관없습니다.

예: imsegkmeans(I,k,NumAttempts=5)는 군집화 과정을 5번 반복합니다.

R2021a 이전 릴리스에서는 쉼표를 사용하여 각 이름과 값을 구분하고 Name을 따옴표로 묶으십시오.

예: imsegkmeans(I,k,"NumAttempts",5)는 군집화 과정을 5번 반복합니다.

입력 데이터를 평균 0과 단위 분산을 갖도록 정규화합니다. 숫자형 또는 논리형 1(true) 또는 0(false)으로 지정됩니다. true를 지정할 경우 imsegkmeans는 입력값의 각 채널을 개별적으로 정규화합니다.

새 초기 군집 중심 위치를 사용하여 군집화 과정을 반복할 횟수로, 양의 정수로 지정됩니다.

최대 반복 횟수로, 양의 정수로 지정됩니다.

정확도 임계값으로, 양수로 지정됩니다. 연속적인 반복에서 각 군집 중심이 임계값보다 적게 이동하면 이 알고리즘은 중지합니다.

출력 인수

모두 축소

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

L의 데이터형군집 개수
uint8k <= 255
uint16256 <= k <= 65535
uint3265536 <= k <= 2^32-1
double2^32 <= k

군집 중심 위치이며, k×c 크기의 숫자형 행렬로 반환됩니다. 여기서 k는 군집의 개수, c는 채널의 개수입니다. centers는 영상 I와 동일한 데이터형을 가집니다.

  • 이 함수는 재현 가능한 결과를 제공합니다. 여러 번 실행해도 입력 인수가 같으면 출력은 바뀌지 않습니다.

  • imsegkmeans 함수는 지원되는 모든 컬러스페이스에서 입력 영상을 받습니다. 다른 컬러스페이스를 사용하면 다른 결과가 생성됩니다. 입력 영상의 결과가 만족스럽지 않으면 다른 컬러스페이스를 사용해 보십시오. MATLAB®의 컬러스페이스에 대한 자세한 내용은 컬러스페이스 및 컬러스페이스 변환 이해하기 항목을 참조하십시오.

  • double형의 영상에 K-평균 군집화를 수행하려면 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에 개발됨