이미지 분할 - 워터셰드 알고리즘
이름: Xie Yiyuan
학생 ID: 19021110366T
삽입된 소 소개: 이미지의 대상 개체가 서로 연결되어 있어 분할하기가 어렵습니다. 유역 분할 알고리즘은 이러한 유형의 문제를 처리하는 데 자주 사용되며 일반적으로 더 나은 결과를 얻습니다.
Embed Niu Nose: 이미지 분할, 유역 알고리즘
Embed Niu가 질문했습니다: 유역 알고리즘의 구체적인 단계는 무엇입니까?
삽입된 소 텍스트:
1. 개요
유역 분할 알고리즘은 이미지를 "지형 지도"로 간주하며, 여기서 픽셀 값은 상대적으로 밝기가 강한 영역은 상대적으로 크고, 어두운 영역의 픽셀 값은 더 작은 반면, "집수지"와 "유역 경계"를 찾아 이미지를 분할합니다. 그러나 워터셰드 분할 알고리즘을 직접 적용한 결과는 좋지 않은 경우가 많습니다. 영상에서 전경 객체와 배경 객체가 표시되어 구별되는 경우 워터셰드 알고리즘을 적용하면 더 나은 분할 결과를 얻을 수 있습니다. 마커 제어에 기반한 유역 분할 방법은 다음과 같은 기본 단계로 구성됩니다.
1? 개요
유역 분할 알고리즘은 이미지를 "지형도"로 간주하며, 여기서 픽셀 값은 다음과 같습니다. 상대적으로 밝기가 강한 영역의 경우, 어두운 부분의 픽셀값이 작고, "유역"과 "유역경계"를 찾아 영상을 분할합니다. 워터셰드 분할 알고리즘을 직접 적용한 결과는 좋지 않은 경우가 많습니다. 영상에서 전경 객체와 배경 객체가 표시되어 구별되는 경우 워터셰드 알고리즘을 적용하면 더 나은 분할 결과를 얻을 수 있습니다. 마커 제어에 기반한 유역 분할 방법은 다음과 같은 기본 단계로 구성됩니다.
1. 분할 함수를 계산합니다. 이미지에서 더 어두운 부분이 분할될 개체입니다.
2. 전경 랜드마크를 계산합니다. 이는 각 개체 내에 연결된 얼룩 픽셀입니다.
3. 배경 플래그를 계산합니다. 이는 어떤 객체에도 속하지 않는 요소입니다.
4. 전경 및 배경 표시 위치에서 최소값만 갖도록 분할 기능을 수정합니다.
5. 수정된 분할 함수에 대해 유역 변환 계산을 수행합니다.
MATLAB 이미지 처리 도구 상자 사용
참고: 해당 기간 동안 fspecial, imfilter, watershed, label2rgb, imopen, imclose, imreconstruct, imcomplement, imregionalmax, bwareaopen, greythresh 및 부과민 기능 등
2단계?
?첫 번째 단계: 컬러 이미지를 읽고 이를 회색조 이미지로 변환합니다.
clc; /p>
rgb = imread('pears.png');
if ndims(rgb) == 3
?I = rgb2gray(rgb);
else
?I = rgb;
end
Figure('단위', '정규화', '위치', [0 0 1 1]);
2단계: 기울기 진폭을 분할 함수로 사용
Sobel 가장자리 연산자를 사용하여 이미지를 수평 및 수직 방향으로 필터링한 다음 모듈러스를 계산합니다. 값, 소벨 연산자에 의해 필터링된 이미지는 경계에서 상대적으로 큰 값을 나타내고, 경계가 없는 경우에는 매우 작은 값을 갖게 됩니다.
hy = fspecial('sobel');
hx = hy';
Iy = imfilter(double(I), hy, 'replicate') ;
Ix = imfilter(double(I), hx, '복제');
gradmag = sqrt(Ix.^2 + Iy.^2);
숫자('단위', '정규화', '위치', [0 0 1 1]);
subplot(1, 2, 1), imshow(I,[]); ('회색조 이미지')
subplot(1, 2, 2); imshow(gradmag,[]), title('경사도 크기 이미지')
경사도 크기를 직접적으로 수행할 수 있나요? 유역 알고리즘을 사용하는 이미지?
L = watershed(gradmag);
Lrgb = label2rgb(L);
Figure('단위', '정규화', '위치', [ 0 0 1 1]);
subplot(1, 2, 1); imshow(gradmag,[]), title('경사도 크기 이미지')
subplot(1 , 2, 2); imshow(Lrgb); title('워터셰드 변환을 위한 그라데이션 진폭')
워터셰드 알고리즘에 대한 그래디언트 모듈 값 이미지를 직접 사용하여 얻은 결과는 종종 과도하게 분할됩니다. 따라서 일반적으로 더 나은 분할 결과를 얻으려면 전경 개체와 배경 개체를 별도로 표시해야 합니다.
3단계: 전경 객체 표시
전경 마커를 얻기 위해 여기에 적용할 수 있는 다양한 방법이 있습니다. 전경 마커는 전경 객체 내부에 연결된 얼룩 픽셀이어야 합니다. 이 예에서는 "개방 기반 재구성" 및 "폐쇄 기반 재구성" 형태학적 기술을 사용하여 이미지를 정리합니다. 이러한 작업은 각 개체 내에 단위 최대값을 생성하여 imregionalmax를 사용하여 위치를 지정할 수 있도록 합니다.
열기 및 닫기 작업: 부식이 먼저 발생한 다음 팽창을 먼저 팽창이라고 하고 그 다음 부식을 닫기라고 합니다. 열기 및 닫기 작업은 전체적인 기하학적 왜곡을 방지하면서 구조 요소보다 작은 특정 이미지 세부 정보를 제거할 수 있습니다. 개구부 작업은 구조 요소보다 작은 박차를 걸러내고 가느다란 겹침 부분을 잘라 분리하는 역할을 할 수 있으며, 닫힘 작업은 구조 요소보다 작은 간격이나 구멍을 채우고 짧은 간격을 겹쳐 연결하는 역할을 할 수 있습니다. .
열기 작업은 부식 후 팽창이고, 열기 기반 재구성(재구성 기반 열기 작업)은 부식 후 형태학적 재구성입니다. 아래 두 가지 방법을 비교해 보세요. 먼저 imopen을 사용하여 열기 작업을 수행합니다.
se = strel('disk', 20);
Io = imopen(I, se);
Figure('units', 'normalized' , '위치', [0 0 1 1]);
subplot(1, 2, 1) imshow(I, []); title('회색조 이미지');
subplot(1, 2, 2); imshow(Io), title('이미지 열기 작업')
다음으로 침식 후 재구성을 통해 열기 기반 재구성 계산이 수행됩니다.
Ie = imerode(I,se)
Iobr = imreconstruct(Ie,I);
Figure('단위', '정규화', '위치 ', [0 0 1 1]);
subplot(1, 2, 1); imshow(I, []) title('회색조 이미지');
subplot (1, 2, 2); imshow(Iobr, []), title('열기를 기반으로 재구성된 이미지')
열기 작업 후 닫기 작업을 수행하면 더 어두운 점을 제거하고 지점 표시. 기존의 형태학적 폐쇄 연산과 폐쇄 기반 재구성 연산을 비교합니다. 먼저, imclose를 사용하십시오:
Ioc = imclose(Io, se);
Ic = inclose(I,se);
Figure('units', '정규화됨', '위치', [0 0 1 1]);
subplot(2, 2, 1) imshow(I, []); title('회색조 이미지');< / p>
subplot(2, 2, 2); imshow(Io, []); title('운영 이미지 열기');
subplot(2, 2, 3); Ic, []); title('닫기 작업 이미지');
subplot(2, 2, 4) imshow(Ioc, []), title('닫기 작업');
p>이제 imdilate를 사용한 다음 imreconstruct를 사용하십시오. 입력 이미지는 보완되어야 하고, imreconstruct 출력 이미지도 보완되어야 합니다. IM2 = Implement(IM)은 이미지 IM의 보수를 계산합니다. IM은 이진 이미지 또는 RGB 이미지일 수 있습니다. IM2는 IM과 동일한 데이터 유형 및 크기를 갖습니다.
Iobrd = imdilate(Iobr, se);
Iobrcbr = imreconstruct(imcomplement(Iobrd), imcomplement(Iobr));
Iobrcbr = imcomplement(Iobrcbr );
Figure('단위', '정규화', '위치', [0 0 1 1]);
subplot(2, 2, 1); , []); title('회색조 이미지');
subplot(2, 2, 2) imshow(Ioc, []); title('열기 및 닫기 작업');
subplot(2, 2, 3); imshow(Iobr, []); title('개방을 기반으로 재구성된 이미지');
subplot(2, 2, 4); Iobrcbr, []), title('클로저를 기반으로 재구성된 이미지');
Iobrcbr과 loc를 비교하면 객체의 전체적인 모양에 영향을 주지 않고 작은 얼룩을 제거하는 응용 프로그램에서 재구성 기반 개폐 작업은 표준 개폐 재구성보다 효율적입니다. 더 나은 전경 라벨링을 얻으려면 Iobrcbr의 로컬 최대값을 계산하십시오.
fgm = imregionalmax(Iobrcbr);
Figure('단위', '정규화', '위치', [0 0 1 1]);
subplot(1, 3, 1); imshow(I, []); title('회색조 이미지');
subplot(1, 3, 2); ('재구성에 따른 열기 및 닫기 작업');
subplot(1, 3, 3) imshow(fgm, []) title('로컬 최대 이미지');
이 결과를 이해하는 데 도움이 되도록 원본 이미지에 전경 마커를 오버레이합니다.
It1 = rgb(:, :, 1);
It2 = rgb(:, :, 2);
It3 = rgb(:, : , 3);
It1(fgm) = 255; It2(fgm) = 0; It3(fgm) = 0;
I2 = cat(3, It1, It2, It3 );
Figure('단위', '정규화', '위치', [0 0 1 1]);
subplot(2, 2, 1); , []); title('원본 이미지');
subplot(2, 2, 2); imshow(Iobrcbr, []); title('재구성에 따른 열기 및 닫기 작업');
subplot(2, 2, 3); imshow(fgm, []); title('로컬 최대 이미지');
subplot(2, 2, 4); (I2); title('원본 이미지에 겹쳐진 로컬 최대값');
대부분의 폐색 및 그림자 객체는 표시되지 않습니다. 이는 이러한 객체가 결과에 합리적으로 표시되지 않음을 의미합니다. 분할. 또한 일부 개체에는 개체 가장자리까지 확장되는 전경 마커가 있습니다. 즉, 표시된 부분의 가장자리를 청소한 다음 축소해야 한다는 의미입니다. 이는 폐쇄 작업과 부식 작업을 통해 수행할 수 있습니다.
se2 = strel(ones(5,5));
fgm2 = imclose(fgm, se2);
fgm3 = imerode(fgm2, se2) ;
Figure('단위', '정규화', '위치', [0 0 1 1]);
subplot(2, 2, 1); []); title('재구성에 따른 열기 및 닫기 작업');
subplot(2, 2, 2) imshow(fgm, []);
subplot(2, 2, 3); imshow(fgm2, []); title('작업 닫기');
subplot(2, 2, 4); fgm3, []); title('Erosion Operation');
이 프로세스에서는 제거해야 하는 일부 흩어진 픽셀이 남습니다. bwareaopen을 사용하여 특정 픽셀 수보다 작은 점을 제거할 수 있습니다. BW2 = bwareaopen(BW,P)는 이진 영상에서 P 픽셀 값보다 작은 연결된 블록을 제거하여 다른 이진 영상 BW2를 얻습니다.
fgm4 = bwareaopen(fgm3, 20);
It1 = rgb(:, :, 1);
It2 = rgb(:, :, 2 );
It3 = rgb(:, :, 3);
It1(fgm4) = 255; It2(fgm4) = 0;
p>I3 = cat(3, It1, It2, It3);
Figure('단위', '정규화', '위치', [0 0 1 1]);
subplot(2, 2, 1); imshow(I2, []); title('원본 이미지에 겹쳐진 로컬 최대값');
subplot(2, 2, 2); imshow(fgm3, []); title('부식 닫기 작업');
subplot(2, 2, 3) imshow(fgm4, []); ;
subplot(2, 2, 4); imshow(I3, []); title('로컬 최대값을 수정하고 이를 원본 이미지에 겹쳐 놓습니다.')
단계 4: 배경 태그 계산
이제 배경에 태그를 지정해야 합니다. 정리된 이미지 Iobrcbr에서 어두운 픽셀은 배경에 속하므로 임계값 작업을 시작할 수 있습니다.
bw =im2bw(Iobrcbr, greythresh(Iobrcbr));
Figure('단위', '정규화', '위치', [0 0 1 1]);
p> p>
subplot(1, 2, 1); imshow(Iobrcbr, []); title('재구성에 따른 열기 및 닫기 작업');
subplot(1, 2, 2); imshow(bw, []); title('Threshold Segmentation');
배경 픽셀은 검은색 영역에 있지만 이상적으로는 배경 마커가 너무 클 필요가 없습니다. 분할할 개체의 가장자리에 가깝습니다. "골격 영향 범위"를 계산하여 배경 또는 SKIZ, bw의 전경을 "얇게" 만듭니다. 이는 bw의 거리 변환의 유역 변환을 계산한 다음 결과 유역 능선(DL==0)을 찾는 방식으로 달성할 수 있습니다. D = bwdist(BW)는 이진 영상 BW의 유클리드 행렬을 계산합니다. BW의 각 픽셀에 대해 거리 변환은 픽셀과 BW의 0이 아닌 가장 가까운 픽셀 사이의 거리를 지정합니다. bwdist는 기본적으로 유클리드 거리 공식을 사용합니다. BW는 임의의 차원을 가질 수 있으며 D와 BW는 동일한 크기를 갖습니다.
D = bwdist(bw);
DL = 유역(D);
bgm = DL == 0;
그림 ('단위', '정규화', '위치', [0 0 1 1]);
subplot(2, 2, 1) imshow(Iobrcbr, []); 재구성 열기 및 닫기 작업');
subplot(2, 2, 2); imshow(bw, []) title('임계값 분할');
subplot(2 , 2, 3); imshow(label2rgb(DL), []); title('유역 변환 다이어그램');
subplot(2, 2, 4) imshow(bgm, []); title ('Watershed 변환 능선 지도');
5단계: 분할 함수의 유역 변환 계산
imimposemin 함수를 사용하여 이미지를 수정하는 데 사용할 수 있습니다. 특정 필수 위치에는 로컬 최소값이 있습니다.
여기서 Imposemin을 사용하여 경사 진폭 이미지를 수정하여 전경 및 배경으로 표시된 픽셀에 로컬 최소값만 가질 수 있습니다.
gradmag2 = imimposemin(gradmag, bgm | fgm4);
숫자('단위', '정규화', '위치', [0 0 1 1]);
subplot(2,2,1)imshow(bgm,[]);title('유역 변환 능선 지도');
subplot(2, 2, 2) imshow(fgm4 , []); title('전경 표시');
subplot(2, 2, 3); imshow(gradmag, []);
subplot(2, 2, 4); imshow(gradmag2, []); title('Modify 그래디언트 진폭 이미지');
마지막으로 유역을 기반으로 한 이미지 분할 계산을 수행할 수 있습니다.
6단계: 결과 보기
시각화 기술 중 하나는 전경 마커, 배경 마커 및 분할된 개체 경계를 초기 이미지에 오버레이하는 것입니다. 팽창은 객체 경계를 더 잘 보이게 만드는 것과 같은 특정 요구 사항을 달성하는 데 사용될 수 있습니다. 객체 경계는 L==0에 위치합니다.
It1 = rgb(:, :, 1);
It2 = rgb(:, :, 2);
It3 = rgb(:, : , 3);
fgm5 = imdilate(L == 0, ones(3, 3)) | bgm | fgm4;
It1(fgm5) = 255; = 0; It3(fgm5) = 0;
I4 = cat(3, It1, It2, It3);
Figure('단위', '정규화', '위치' , [0 0 1 1]);
subplot(1, 2, 1); imshow(rgb, []) title('원본 이미지');
subplot( 1, 2, 2); imshow(I4, []); title('원본 이미지에 겹쳐진 마커 및 객체 가장자리');
전경 및 배경 마커가 결과에 미치는 영향 시각화. 여러 위치에서, 가려진 객체에는 전경 마커가 없기 때문에 더 어두운 객체의 일부가 인접한 더 밝은 이웃과 병합됩니다.
또 다른 유용한 시각화 기술은 마커 행렬을 컬러 이미지로 표시하는 것입니다. watershed 및 bwlabel로 얻은 것과 같은 레이블 행렬은 label2rgb를 사용하여 표시하기 위해 트루 컬러 이미지로 변환될 수 있습니다.
Lrgb = label2rgb(L,'jet', 'w', 'shuffle');
Figure('단위', '정규화', '위치', [0 0 1 1]);
subplot(1, 2, 1); imshow(rgb, []); title('원본 이미지');
subplot(1, 2, 2); imshow(Lrgb); title('색상 유역 마커 매트릭스');
투명도를 사용하여 이 의사 색상 마커 매트릭스를 오버레이하고 원본 밝기 이미지에 표시할 수 있습니다.
Figure('단위', '정규화', '위치', [0 0 1 1])
subplot(1, 2, 1); ]); title('원본 이미지');
subplot(1, 2, 2); imshow(rgb, []) 잠깐만;
imshow(Lrgb );
set(himage, 'AlphaData', 0.3);
title('원본 이미지에 겹쳐진 마커 행렬');