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

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

이 예제에서는 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');

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

밝기 변화를 무시할 경우 영상에서 몇 가지 색이 보입니까? 영상에는 세 가지 색, 즉 흰색, 파란색, 분홍색이 있습니다. 이러한 색을 눈으로 얼마나 쉽게 구별할 수 있는지 보십시오. L*a*b* 컬러스페이스(CIELAB 또는 CIE 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);

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

군집화는 객체 그룹을 분리하는 방법입니다. K-평균 군집화는 각 객체가 스페이스에서 한 위치를 차지하는 것으로 처리합니다. 이 함수는 객체가 각 군집 내에서는 최대한 서로 가까이 있고 다른 군집 내의 객체와는 최대한 멀리 있도록 하는 파티션을 찾습니다. K-평균 군집화를 사용하려면 분할할 군집 수와 두 객체가 서로 얼마나 가까운지를 수량화하는 거리 측정법을 지정해야 합니다.

색 정보가 'a*b*' 컬러스페이스에 있기 때문에 객체는 'a*' 값과 'b*' 값을 갖는 픽셀입니다. imsegkmeans에 사용할 수 있도록 데이터의 데이터형을 single형으로 변환합니다. imsegkmeans를 사용하여 객체를 세 개의 군집으로 군집화합니다.

ab = lab_he(:,:,2:3);
ab = im2single(ab);
nColors = 3;
% repeat the clustering 3 times to avoid local minima
pixel_labels = imsegkmeans(ab,nColors,'NumAttempts',3);

입력값의 모든 객체에 대해 imsegkmeans는 군집에 해당하는 인덱스 또는 레이블을 반환합니다. 픽셀 레이블을 사용하여 영상의 모든 픽셀에 레이블을 지정합니다.

imshow(pixel_labels,[])
title('Image Labeled by Cluster Index');

4단계: H&E 영상을 색으로 분할한 영상 만들기

pixel_labels를 사용하여 hestain.png의 객체를 색으로 분리할 수 있습니다. 그 결과, 세 개의 영상이 만들어집니다.

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

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

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

5단계: 핵 분할하기

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

'L*' 층에는 각 색의 밝기 값이 포함되어 있다는 사실을 기억하십시오. 이 군집에서 픽셀의 밝기 값을 추출한 다음, 그 값을 imbinarize를 사용하여 전역 임계값으로 이진화합니다. 마스크 is_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');