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

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 = im2gray(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");

헤마톡실린과 에오신(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");

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

입력 인수

모두 축소

분할할 영상으로, 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에 개발됨