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

bwmorph

이진 영상에 대한 모폴로지 연산

구문

BW2 = bwmorph(BW,operation)
BW2 = bwmorph(BW,operation,n)

설명

예제

BW2 = bwmorph(BW,operation)은 이진 영상 BW에 특정 모폴로지 연산을 적용합니다.

참고

3차원 볼륨 영상에서 모폴로지 연산을 수행하려면 bwmorph3을 사용하십시오.

선택적으로 GPU를 사용하여 모폴로지 연산을 수행할 수 있습니다(Parallel Computing Toolbox™가 필요함). 자세한 내용은 Image Processing on a GPU 항목을 참조하십시오.

BW2 = bwmorph(BW,operation,n)은 모폴로지 연산을 n번 적용합니다. nInf일 수 있으며, 이 경우 영상에 더 이상 변화가 없을 때까지 연산이 반복됩니다.

예제

이진 영상에 대해 모폴로지 연산 수행하기

이진 영상을 읽어 들인 후 이를 표시합니다.

BW = imread('circles.png');
imshow(BW);

내부 픽셀을 제거하여 형태의 윤곽선만 남깁니다.

BW2 = bwmorph(BW,'remove');
figure
imshow(BW2)

영상 골격을 표시합니다.

BW3 = bwmorph(BW,'skel',Inf);
figure
imshow(BW3)

GPU에서 모폴로지 연산 수행하기

이 예제에서는 이전 예제와 동일한 연산을 GPU에서 수행합니다. 먼저, 영상을 gpuArray로 읽어 들입니다.

BW1 = gpuArray(imread('circles.png'));
figure
imshow(BW1)

BW2 = bwmorph(BW1,'remove');
figure
imshow(BW2)

BW3 = bwmorph(BW1,'skel',Inf);
figure
imshow(BW3)

입력 인수

모두 축소

입력 영상으로, 이진 영상으로 지정됩니다. 입력 영상은 숫자형이거나 논리형일 수 있으며, 비희소 형식의 2차원 실수여야 합니다.

GPU를 사용하여 모폴로지 연산을 수행하려면 BW를 이진 영상을 포함하는 gpuArray로 지정하십시오.

데이터형: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | logical

수행할 모폴로지 연산으로, 다음 중 하나로 지정됩니다.

연산

설명

'bothat'

원래 영상에서 모폴로지 닫기(팽창을 적용한 후 침식 적용)가 수행된 영상을 뺀 값을 반환하는, "bottom-hat" 모폴로지 연산을 수행합니다.

'branchpoints'

골격의 분기점을 찾습니다. 예를 들면 다음과 같습니다.

0  0  1  0  0           0  0  0  0  0
0  0  1  0  0  becomes  0  0  0  0  0
1  1  1  1  1           0  0  1  0  0
0  0  1  0  0           0  0  0  0  0
0  0  1  0  0           0  0  0  0  0

참고: 분기점을 찾으려면 영상을 골격화해야 합니다. 골격화된 영상을 만들려면 bwmorph(BW,'skel')을 사용하십시오.

'bridge'

연결되지 않은 픽셀들을 연결합니다. 즉, 값이 0인 픽셀이 두 개의 연결되지 않은 0이 아닌 이웃 픽셀을 갖는 경우 그 픽셀을 1로 설정합니다. 예를 들면 다음과 같습니다.

1  0  0           1  1  0 
1  0  1  becomes  1  1  1 
0  0  1           0  1  1

'clean'

아래 패턴의 중앙 픽셀과 같이, 고립된 픽셀(0으로 둘러싸인 각각의 1 값)들을 제거합니다.

0  0  0 
0  1  0 
0  0  0

'close'

모폴로지 닫기(팽창을 적용한 후 침식 적용)를 수행합니다.

'diag'

대각선 채우기를 사용하여 배경의 8-연결성을 제거합니다. 예를 들면 다음과 같습니다.

0  1  0           0  1  0 
1  0  0  becomes  1  1  0 
0  0  0           0  0  0

'endpoints'

골격의 끝점을 찾습니다. 예를 들면 다음과 같습니다.

1  0  0  0           1  0  0  0
0  1  0  0  becomes  0  0  0  0
0  0  1  0           0  0  1  0
0  0  0  0           0  0  0  0

참고: 끝점을 찾으려면 영상을 골격화해야 합니다. 골격화된 영상을 만들려면 bwmorph(BW,'skel')을 사용하십시오.

'fill'

아래 패턴의 중앙 픽셀과 같이, 고립된 내부 픽셀(1로 둘러싸인 각각의 0 값)들을 채웁니다.

1  1  1 
1  0  1 
1  1  1

'hbreak'

H의 연결부 픽셀을 제거합니다. 예를 들면 다음과 같습니다.

1  1  1           1  1  1 
0  1  0  becomes  0  0  0 
1  1  1           1  1  1

'majority'

한 픽셀의 3x3 이웃에서 5개 이상의 픽셀이 1인 경우 이 픽셀을 1로 설정합니다. 그렇지 않으면 픽셀을 0으로 설정합니다.

'open'

모폴로지 열기(침식을 적용한 후 팽창 적용)를 수행합니다.

'remove'

내부 픽셀을 제거합니다. 이 옵션은 픽셀의 4-연결 이웃이 모두 1인 경우 픽셀을 0으로 설정하여, 경계선 픽셀만 남겨 둡니다.

'shrink'

n = Inf를 사용하여 객체가 점이 되도록 줄입니다. 구멍이 없는 객체는 점점 줄어들어 점이 되고, 구멍이 있는 객체는 점점 줄어들어 각 구멍과 바깥쪽 경계선 중간에 연결된 고리가 되도록 픽셀을 제거합니다. 이 옵션은 오일러 수를 유지합니다.

'skel'

n = Inf를 사용하여 객체의 경계선에 있는 픽셀을 제거하지만, 객체가 분해되지는 않게 합니다. 남은 픽셀들이 영상 골격을 구성합니다. 이 옵션은 오일러 수를 유지합니다.

3차원 볼륨 영상을 가지고 작업하거나 골격의 가지를 제거하려면 bwskel 함수를 사용하십시오.

'spur'

스퍼 픽셀을 제거합니다. 예를 들면 다음과 같습니다.

0  0  0  0           0  0  0  0
0  0  0  0           0  0  0  0
0  0  1  0  becomes  0  0  0  0
0  1  0  0           0  1  0  0
1  1  0  0           1  1  0  0

'thicken'

n = Inf를 사용하여, 이전에 연결되지 않은 객체가 8-연결 객체가 될 때까지 객체 외부에 픽셀을 추가하여 객체를 두껍게 만듭니다. 이 옵션은 오일러 수를 유지합니다.

'thin'

n = Inf를 사용하여 객체가 선이 되도록 가늘게 만듭니다. 이 옵션은 구멍이 없는 객체는 점점 줄어들어 최소한으로 연결된 획이 되고, 구멍이 있는 객체는 점점 줄어들어 각 구멍과 바깥쪽 경계선 중간에 연결된 고리가 되도록 픽셀을 제거합니다. 이 옵션은 오일러 수를 유지합니다. 자세한 내용은 알고리즘 항목을 참조하십시오.

'tophat'

원래 영상에서 모폴로지 열기(침식을 적용한 후 팽창 적용)가 수행된 영상을 뺀 값을 반환하는, "top-hat" 모폴로지 연산을 수행합니다.

예: BW3 = bwmorph(BW,'skel');

데이터형: char | string

연산을 수행할 횟수로, 숫자형 값으로 지정됩니다. nInf일 수 있으며, 이 경우 bwmorph는 영상에 더 이상 변화가 없을 때까지 연산을 반복합니다.

예: BW3 = bwmorph(BW,'skel',100);

데이터형: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | logical

출력 인수

모두 축소

출력 영상으로, 이진 영상으로 반환됩니다.

GPU를 사용하여 모폴로지 연산을 수행하면 BW2는 이진 영상을 포함하는 gpuArray로 반환됩니다.

데이터형: logical

  • 침식이나 팽창을 수행하려면 imerode 또는 imdilate 함수를 사용하십시오. bwmorph에 의해 수행된 팽창이나 침식과 같은 결과를 얻으려면 imerode나 imdilate 함수에 구조 요소 ones(3)을 지정하십시오.

알고리즘

모두 축소

bwmorph'thin' 옵션과 함께 사용될 경우 다음 알고리즘을 사용합니다 [3].

  1. 첫 번째 부반복(subiteration)에서, 조건 G1, G2G3이 모두 충족될 경우에만 픽셀 p를 삭제합니다.

  2. 두 번째 부반복에서, 조건 G1, G2G3이 모두 충족될 경우에만 픽셀 p를 삭제합니다.

조건 G1:

XH(p)=1

여기서

XH(p)=i=14bi

bi={1, if x2i1=0 and (x2i=1 or x2i+1=1)0, otherwise                                          

x1, x2, ..., x8p의 이웃 픽셀 8개(동쪽에 있는 이웃 픽셀부터 시작하여 반시계 방향으로 번호가 지정됨)의 값입니다.

조건 G2:

2min{n1(p),n2(p)}3

여기서

n1(p)=k=14x2k1x2k

n2(p)=k=14x2kx2k+1

조건 G3:

(x2x3x¯8)x1=0

조건 G3':

(x6x7x¯4)x5=0

두 번의 부반복이 모여 한 번의 세선화 알고리즘의 반복을 구성합니다. 사용자가 반복 횟수를 무한으로 지정하면(n=Inf) 영상에 더 이상 변화가 없을 때까지 반복이 되풀이됩니다. 조건들은 모두 미리 계산된 룩업 테이블과 함께 applylut를 사용하여 테스트됩니다.

참고 문헌

[1] Haralick, Robert M., and Linda G. Shapiro, Computer and Robot Vision, Vol. 1, Addison-Wesley, 1992.

[2] Kong, T. Yung and Azriel Rosenfeld, Topological Algorithms for Digital Image Processing, Elsevier Science, Inc., 1996.

[3] Lam, L., Seong-Whan Lee, and Ching Y. Suen, "Thinning Methodologies-A Comprehensive Survey," IEEE Transactions on Pattern Analysis and Machine Intelligence, Vol 14, No. 9, September 1992, page 879, bottom of first column through top of second column.

[4] Pratt, William K., Digital Image Processing, John Wiley & Sons, Inc., 1991.

확장 기능

R2006a 이전에 개발됨