경계 검출과 모폴로지를 사용하여 세포 검출하기
이 예제에서는 경계 검출과 기본 모폴로지를 사용하여 세포를 검출하는 방법을 보여줍니다. 배경과 두드러지게 대비되는 객체는 영상에서 쉽게 검출할 수 있습니다.
1단계: 영상 읽어 들이기
전립선암 세포 영상인 cell.tif
영상을 읽어 들입니다. 이 영상에는 세포가 두 개 있지만, 완전히 보이는 세포는 하나뿐입니다. 목표는 완전히 보이는 세포를 검출 또는 분할하는 것입니다.
I = imread('cell.tif'); 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단계: 완전한 세포 검출하기
분할할 객체는 배경 영상과 대비 차이가 큽니다. 대비 변화는 영상 기울기를 계산하는 연산자를 통해 검출할 수 있습니다. 분할된 세포를 포함하는 이진 마스크를 만들려면 기울기 영상을 계산하고 임계값을 적용하십시오.
edge
와 Sobel 연산자를 사용하여 임계값을 계산합니다. 임계값을 조정하고 edge
를 다시 사용하여, 분할된 세포를 포함하는 이진 마스크를 얻습니다.
[~,threshold] = edge(I,'sobel'); fudgeFactor = 0.5; BWs = edge(I,'sobel',threshold * fudgeFactor);
결과로 생성된 이진 기울기 마스크를 표시합니다.
imshow(BWs)
title('Binary Gradient Mask')
3단계: 영상 팽창시키기
이진 기울기 마스크에는 영상의 고대비를 나타내는 선이 표시됩니다. 이러한 선으로 원하는 객체의 윤곽을 알기가 어렵습니다. 원본 영상과 비교해 보면, 기울기 마스크의 객체를 둘러싼 선들 간에 간격이 있는 것을 알 수 있습니다. 이러한 선 간격은 선형 구조 요소를 사용하여 Sobel 영상을 팽창시키면 사라집니다. strel
함수를 사용하여 두 개의 직교하는 선형 구조 요소를 만듭니다.
se90 = strel('line',3,90); se0 = strel('line',3,0);
세로 구조 요소 다음에 가로 구조 요소를 사용하여 이진 기울기 마스크를 팽창시킵니다. imdilate
함수는 영상을 팽창시킵니다.
BWsdil = imdilate(BWs,[se90 se0]);
imshow(BWsdil)
title('Dilated Gradient Mask')
4단계: 내부 간격 채우기
팽창된 기울기 마스크는 세포 윤곽선이 꽤 깔끔하게 정돈되었지만, 셀 내부에 아직도 구멍이 있습니다. 이러한 구멍을 채우려면 imfill
함수를 사용하십시오.
BWdfill = imfill(BWsdil,'holes'); imshow(BWdfill) title('Binary Image with Filled Holes')
5단계: 테두리에 접한 객체 제거하기
원하는 세포를 분할했지만, 발견된 또 다른 객체가 있습니다. 영상의 테두리에 접한 모든 객체는 imclearborder
함수를 사용하여 제거할 수 있습니다. 대각 연결을 제거하려면 imclearborder
함수의 연결성을 4
로 설정하십시오.
BWnobord = imclearborder(BWdfill,4);
imshow(BWnobord)
title('Cleared Border Image')
6단계: 객체 평활화하기
마지막으로, 분할된 객체가 자연스럽게 보이도록 다이아몬드 구조 요소로 영상을 두 번 침식시켜 객체를 평활화합니다. strel
함수를 사용하여 다이아몬드 구조 요소를 만듭니다.
seD = strel('diamond',1); BWfinal = imerode(BWnobord,seD); BWfinal = imerode(BWfinal,seD); imshow(BWfinal) title('Segmented Image');
7단계: 분할 시각화하기
labeloverlay
함수를 사용하여 원본 영상 위에 마스크를 표시할 수 있습니다.
imshow(labeloverlay(I,BWfinal))
title('Mask Over Original Image')
분할된 객체를 표시하는 또 다른 방법은 분할된 세포 주위에 윤곽선을 그리는 것입니다. bwperim
함수를 사용하여 윤곽선을 그립니다.
BWoutline = bwperim(BWfinal);
Segout = I;
Segout(BWoutline) = 255;
imshow(Segout)
title('Outlined Original Image')
참고 항목
imfill
| imclearborder
| edge
| imdilate
| imerode
| bwperim
| strel