이 페이지의 내용은 이전 릴리스에 관한 것입니다. 해당 영문 페이지는 최신 릴리스에서 제거되었습니다.

영상 분할을 사용하여 세포 검출하기

이 예제에서는 경계 검출과 기본 모폴로지를 사용하여 세포를 검출하는 방법을 보여줍니다. 배경과 두드러지게 대비되는 객체는 영상에서 쉽게 검출할 수 있습니다. 이 예제에 사용된 세포는 전립선암 세포입니다.

1단계: 영상 읽어 들이기

전립선암 세포 영상인 cell.tif 영상을 읽어 들입니다.

I = imread('cell.tif');
figure, imshow(I), title('original image');
text(size(I,2),size(I,1)+15, ...
    'Image courtesy of Alan Partin', ...
    'FontSize',7,'HorizontalAlignment','right');
text(size(I,2),size(I,1)+25, ....
    'Johns Hopkins University', ...
    'FontSize',7,'HorizontalAlignment','right');

2단계: 완전한 세포 검출하기

이 영상에는 세포가 두 개 있지만, 완전히 보이는 세포는 하나뿐입니다. 이 세포를 검출해 보겠습니다. 객체 검출은 분할(segmentation)이라고도 합니다. 분할할 객체는 배경 영상과 대비 차이가 큽니다. 대비 변화는 영상 기울기를 계산하는 연산자를 통해 검출할 수 있습니다. 영상 기울기를 계산하고 임계값을 적용하여, 분할된 세포를 포함하는 이진 마스크를 생성할 수 있습니다. 먼저, edge와 소벨(Sobel) 연산자를 사용하여 임계값을 계산합니다. 그런 다음 임계값을 조정하고 edge를 다시 사용하여, 분할된 세포를 포함하는 이진 마스크를 얻습니다.

[~, threshold] = edge(I, 'sobel');
fudgeFactor = .5;
BWs = edge(I,'sobel', threshold * fudgeFactor);
figure, imshow(BWs), title('binary gradient mask');

3단계: 영상 팽창시키기

이진 기울기 마스크에는 영상의 고대비를 나타내는 선이 표시됩니다. 이러한 선으로 원하는 객체의 윤곽을 알기가 어렵습니다. 원본 영상과 비교해 보면, 기울기 마스크의 객체를 둘러싼 선들 간에 간격이 있는 것을 알 수 있습니다. 이러한 선 간격은 선형 구조 요소(strel 함수로 만들 수 있음)를 사용하여 소벨(Sobel) 영상을 팽창시키면 사라집니다.

se90 = strel('line', 3, 90);
se0 = strel('line', 3, 0);

세로 구조 요소 다음에 가로 구조 요소를 사용하여 이진 기울기 마스크를 팽창합니다. imdilate 함수는 영상을 팽창시킵니다.

BWsdil = imdilate(BWs, [se90 se0]);
figure, imshow(BWsdil), title('dilated gradient mask');

4단계: 내부 간격 채우기

팽창된 기울기 마스크는 세포 윤곽선이 꽤 깔끔하게 정돈되었지만, 셀 내부에 아직도 구멍이 있습니다. 이러한 구멍을 채우기 위해 imfill 함수를 사용합니다.

BWdfill = imfill(BWsdil, 'holes');
figure, imshow(BWdfill);
title('binary image with filled holes');

5단계: 테두리에 접한 객체 제거하기

원하는 세포를 분할했지만, 발견된 또 다른 객체가 있습니다. 영상의 테두리에 접한 모든 객체는 imclearborder 함수를 사용하여 제거할 수 있습니다. 대각 연결을 제거하기 위해 imclearborder 함수에서 연결성이 4로 설정되었습니다.

BWnobord = imclearborder(BWdfill, 4);
figure, imshow(BWnobord), title('cleared border image');

6단계: 객체 스무딩하기

마지막으로, 분할된 객체가 자연스럽게 보이도록 다이아몬드 구조 요소로 영상을 두 번 침식시켜 객체를 스무딩합니다. strel 함수를 사용하여 다이아몬드 구조 요소를 만듭니다.

seD = strel('diamond',1);
BWfinal = imerode(BWnobord,seD);
BWfinal = imerode(BWfinal,seD);
figure, imshow(BWfinal), title('segmented image');

분할된 객체를 표시할 수 있는 다른 방법은 분할된 세포 주위에 윤곽선을 두는 것입니다. 윤곽선은 bwperim 함수로 생성됩니다.

BWoutline = bwperim(BWfinal);
Segout = I; 
Segout(BWoutline) = 255; 
figure, imshow(Segout), title('outlined original image');