Main Content

이 번역 페이지는 최신 내용을 담고 있지 않습니다. 최신 내용을 영문으로 보려면 여기를 클릭하십시오.

K-평균 군집화를 사용한 색 기반 분할

이 예제에서는 K-평균 군집화를 사용하여 색을 자동으로 분할하는 방법을 보여줍니다.

군집화는 객체 그룹을 분리하는 방법입니다. K-평균 군집화는 각 객체가 스페이스에서 한 위치를 차지하는 것으로 처리합니다. 이 함수는 객체가 각 군집 내에서는 최대한 서로 가까이 있고 다른 군집 내의 객체와는 최대한 멀리 있도록 하는 파티션을 찾습니다. imsegkmeans 함수를 사용해서 영상 픽셀들의 값을 기준으로 컬러스페이스 내에서 여러 군집으로 분리할 수 있습니다. 이 예제에서는 RGB 및 L*a*b* 컬러스페이스에서 영상에 대한 k-평균 군집화를 수행하여, 서로 다른 컬러스페이스를 사용하는 것이 어떻게 분할 결과를 개선해 줄 수 있는지 보여줍니다.

1단계: 영상 읽어 들이기

헤마톡실린과 에오신(H&E)으로 염색한 조직을 촬영한 영상 hestain.png를 읽어 들입니다. 이러한 염색법을 사용해 병리학자는 파란색-자주색과 분홍색으로 염색된 조직 유형을 쉽게 구별할 수 있습니다.

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.

2단계: K-평균 군집화를 사용하여 RBG 컬러스페이스의 색 분류하기

RGB 컬러스페이스에서 k-평균 군집화를 사용하여 영상을 3개 영역으로 분할합니다. imsegkmeans 함수는 입력 영상의 각 픽셀마다 어느 한 군집에 대응하는 레이블을 반환합니다.

레이블 영상을 원본 영상에 겹쳐지게 표시합니다. 레이블 영상에서 흰색, 연한 파란색-자주색, 연한 분홍색 영역이 한 그룹으로 잘못 분류되어 있습니다. RGB 컬러스페이스는 각 채널(빨간색, 녹색, 파란색) 속의 밝기 정보와 색 정보를 결합합니다. 따라서 서로 다른 두 색이더라도 밝기가 더 밝으면 서로 가까워지기 때문에 동일한 색이면서 밝기가 더 어두운 경우보다도 분할하기가 어렵습니다.

numColors = 3;
L = imsegkmeans(he,numColors);
B = labeloverlay(he,L);
imshow(B)
title("Labeled Image RGB")

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

3단계: 영상을 RGB 컬러스페이스에서 L*a*b* 컬러스페이스로 변환하기

L*a*b* 컬러스페이스는 영상 광도와 색을 분할합니다. 따라서 밝기에 관계없이 색을 기준으로 영역을 더 쉽게 분할할 수 있습니다. 또한 이 컬러스페이스는 영상에서 선명한 흰색, 파란색-자주색, 분홍색 영역을 인지하는 사람의 시각과도 더 잘 일치합니다.

L*a*b* 컬러스페이스는 CIE XYZ 3자극값에서 파생됩니다. L*a*b* 컬러스페이스는 광도층 L*과 색도층 a*(빨간색-녹색 축에 놓인 색의 위치를 나타냄)와 색도층 b*(파란색-노란색 축에 놓인 색의 위치를 나타냄)로 구성됩니다. 모든 색 정보는 a* 층과 b* 층에 있습니다.

rgb2lab 함수를 사용하여 영상을 L*a*b* 컬러스페이스로 변환합니다.

lab_he = rgb2lab(he);

4단계: K-평균 군집화를 사용하여 a*b* 스페이스의 색 분류하기

색 정보만 사용하여 영상을 분할하려면 lab_he에서 영상을 a* 값과 b* 값으로 제한합니다. imsegkmeans 함수에 사용할 수 있도록 영상의 데이터형을 single형으로 변환합니다. imsegkmeans 함수를 사용하여 영상 픽셀을 3개의 군집으로 분리합니다. 국소 최솟값에 피팅되는 것을 방지하기 위해, 서로 다른 초기 군집 중심 위치를 사용하여 군집화를 세 번 반복하도록 NumAttempts 이름-값 인수의 값을 설정합니다.

ab = lab_he(:,:,2:3);
ab = im2single(ab);
pixel_labels = imsegkmeans(ab,numColors,NumAttempts=3);

레이블 영상을 원본 영상에 겹쳐지게 표시합니다. 새 레이블 영상이 흰색, 파란색-자주색 및 분홍색으로 염색된 조직 영역을 좀 더 명확히 분리합니다.

B2 = labeloverlay(he,pixel_labels);
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.

5단계: H&E 영상을 색상별로 분할하는 영상 만들기

pixel_labels를 사용하여 원래 영상 hestain.png의 객체를 색상별로 분리할 수 있으며, 결과적으로 세 개의 마스크 처리된 영상이 만들어집니다.

mask1 = pixel_labels == 1;
cluster1 = he.*uint8(mask1);
imshow(cluster1)
title("Objects in Cluster 1");

Figure contains an axes object. The axes object with title Objects in Cluster 1 contains an object of type image.

mask2 = pixel_labels == 2;
cluster2 = he.*uint8(mask2);
imshow(cluster2)
title("Objects in Cluster 2");

Figure contains an axes object. The axes object with title Objects in Cluster 2 contains an object of type image.

mask3 = pixel_labels == 3;
cluster3 = he.*uint8(mask3);
imshow(cluster3)
title("Objects in Cluster 3");

Figure contains an axes object. The axes object with title Objects in Cluster 3 contains an object of type image.

6단계: 핵 분할하기

군집 3에는 파란색 객체만 포함되어 있습니다. 여기에는 진한 파란색 객체와 연한 파란색 객체가 있는 것을 볼 수 있습니다. L*a*b* 컬러스페이스의 L* 층을 사용하여 연한 파란색과 진한 파란색을 분리할 수 있습니다. 세포 핵이 진한 파란색입니다.

L* 층에는 각 픽셀의 밝기 값이 포함되어 있습니다. 이 군집에서 픽셀의 밝기 값을 추출한 다음, 그 값을 imbinarize 함수를 사용하여 전역 임계값으로 이진화합니다. 마스크 idx_light_blue는 연한 파란색 픽셀의 인덱스를 제공합니다.

L = lab_he(:,:,1);
L_blue = L.*double(mask3);
L_blue = rescale(L_blue);
idx_light_blue = imbinarize(nonzeros(L_blue));

파란색 객체의 마스크 mask3을 복사한 다음, 마스크에서 연한 파란색 픽셀을 제거합니다. 원래 영상에 새 마스크를 적용한 후 결과를 표시합니다. 진한 파란색 세포 핵만 표시됩니다.

blue_idx = find(mask3);
mask_dark_blue = mask3;
mask_dark_blue(blue_idx(idx_light_blue)) = 0;

blue_nuclei = he.*uint8(mask_dark_blue);
imshow(blue_nuclei)
title("Blue Nuclei")

Figure contains an axes object. The axes object with title Blue Nuclei contains an object of type image.

참고 항목

관련 항목