Main Content

bwmorph

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

설명

예제

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

참고

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

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

예제

모두 축소

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

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

Figure contains an axes object. The axes object contains an object of type image.

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

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

Figure contains an axes object. The axes object contains an object of type image.

영상 골격을 표시합니다.

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

Figure contains an axes object. The axes object contains an object of type image.

입력 인수

모두 축소

이진 영상으로, 2차원 숫자형 행렬 또는 2차원 논리형 행렬로 지정됩니다. 숫자형 입력값의 경우 0이 아닌 픽셀은 1(true)로 간주됩니다.

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

연산

설명

"bothat"

원래 영상에서 모폴로지 닫기가 수행된 영상을 뺀 값을 반환하는, bottom-hat 모폴로지 연산을 수행합니다.

bwmorph 함수는 이웃 ones(3)을 사용하여 모폴로지 닫기를 수행합니다. bottom-hat 모폴로지 연산을 다른 이웃으로 수행하려면 imbothat 함수를 사용하십시오.

"branchpoints"

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

0  0  1  0  0           0  0  0  0  0
0  0  1  0  0           0  0  0  0  0
1  1  1  1  1  becomes  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"

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

bwmorph 함수는 이웃 ones(3)을 사용하여 모폴로지 닫기를 수행합니다. 모폴로지 닫기 연산을 다른 이웃으로 수행하려면 imclose 함수를 사용하십시오.

"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"

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

"open"

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

bwmorph 함수는 이웃 ones(3)을 사용하여 모폴로지 열기를 수행합니다. 모폴로지 열기 연산을 다른 이웃으로 수행하려면 imopen 함수를 사용하십시오.

"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 모폴로지 연산을 수행합니다.

bwmorph 함수는 이웃 ones(3)을 사용하여 모폴로지 열기를 수행합니다. top-hat 모폴로지 연산을 다른 이웃으로 수행하려면 imtophat 함수를 사용하십시오.

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

데이터형: char | string

연산을 수행할 횟수로, 양의 정수 또는 Inf로 지정됩니다. nInf로 지정하는 경우, bwmorph 함수는 영상에 더 이상 변화가 없을 때까지 연산을 반복합니다.

예: 100

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

출력 인수

모두 축소

모폴로지 연산 후 영상으로, 2차원 논리형 행렬로 반환됩니다.

데이터형: logical

알고리즘

모두 축소

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 이전에 개발됨