IDL/Image Processing

DILATE 함수 소개

이상우_idl 2024. 8. 1. 14:21
728x90
반응형

얼마전부터 형태학적 이미지 처리(Morphological Image Processing, MIP)의 범주에 속하는 여러가지 기법들을 지원하는 IDL 함수들을 소개하고 있습니다. 지난 회차 게시물에서는 Erosion(침식) 기법에 해당되는 ERODE 함수를 소개하였고, 오늘은 이어지는 순서로서 Dilation(확장) 기법에 해당되는 DILATE 함수를 소개할 차례입니다. 지금부터 DILATE 함수를 이용하여 Dilation 기법을 적용하는 방법을 예제와 함께 살펴봅시다.

 

Dilation(확장) 기법은 지난번에 소개한 Erosion 기법과는 정반대의 역할이라고 보면 됩니다. 즉 Erosion의 경우에는 이미지 내에 존재하는 형체들을 깎아내어서 그 크기를 감소시키거나 아예 제거한다는 개념이었던 반면, Dilation은 이미지 내에 존재하는 형체들에 대하여 살(?)을 더 붙여서 그 크기를 확장시키는 개념이라고 보면 됩니다. 그리고 만약 형체와 형체 사이 또는 형체 내부에 좁은 틈새가 있을 경우에는 Dilation에 의하여 그 틈새가 채워지게 되는 효과까지도 얻게 됩니다. IDL에서는 바로 DILATE 함수가 이러한 역할을 담당합니다. 이 함수를 사용하는 문법은 다음과 같으며, ERODE 함수의 경우와 동일하다고 보면 됩니다.

 

result = DILATE(image, structure, ~~~~~~)

 

이와 같이 DILATE 함수에는 반드시 두 개의 인수들이 투입되어야 합니다. 먼저 첫번째 인수는 대상이 될 이미지 배열입니다. 그리고 두번째 인수는 구조화 요소(Structuring Element)라고 부르는 배열로서, 첫번째 인수로 투입될 대상이 2차원 이미지 배열이라면 구조화 요소 역시 2차원 배열로 정의되어야 합니다. 구조화 요소라는 개념은 MIP에서 이미지 내의 형체들을 처리하는데 있어서 기준이 되는 형체라고 보면 되는데, Dilation 기법에 있어서 구조화 요소의 역할은 이미지 내의 형체들에 대하여 주변부에 화소들을 추가로 덧붙임으로써 그 크기를 확장시키는 것입니다. 그리고 형체와 형체 사이의 거리가 구조화 요소의 크기보다 더 작은 경우에는 그 사이도 채워지게 됩니다. 물론 좁은 틈새들의 경우도 구조화 요소의 크기보다 작은 경우에는 채워지게 됩니다. 그러면 이해를 돕기 위하여 구체적인 예제를 살펴봅시다. 예제로 사용할 이미지 데이터는 앞선 게시물에서 사용했던 태양 흑점 이미지입니다. 이미지 파일은 아래에 첨부하였습니다.

 

sunspots.png
0.13MB

 

먼저 이 이미지를 원본 그대로 표출하는 과정부터 다음과 같이 진행해봅시다.

 

READ_PNG, 'sunspots.png', data
HELP, data
PRINT, MIN(data), MAX(data)
sz = SIZE(data, /DIM)
win0 = WINDOW(DIMENSIONS=sz, /NO_TOOLBAR)
i0 = IMAGE(data, MARGIN=0, /CURRENT)

 

 

이러한 이미지에 대하여 Dilation 기법을 적용하고자 하는데요. 다만 여기서도 지난 회차에서와 마찬가지로 다음과 같이 원본 이미지에 대하여 마스킹(Masking) 처리를 먼저 진행하기로 합니다. 그 이유는 마스킹 처리가 된 결과 이미지는 0 또는 1의 값들로만 구성된 바이너리(Binary) 이미지가 되는데, 이러한 바이너리 이미지에 대하여 DILATE 함수를 적용하는 것이 이해를 돕는데 있어서 더 유리할 것 같기 때문입니다(물론 DILATE 함수는 원본 이미지와 같은 그레이스케일(Grayscale) 이미지에 대해서도 적용이 가능하지만 여기서는 그렇게 하기로 합니다). 마스킹 처리에 있어서는 다음과 같이 화소값이 180보다 작은 화소들을 판별하도록 하였습니다. 흑점에 해당되는 어두운 형체들을 식별하기 위해서입니다. 마스킹 처리를 거친 결과인 data_f1을 얻고 표출하는 과정은 다음과 같습니다.

 

data_f1 = data LT 180

win1 = WINDOW(DIMENSIONS=sz, /NO_TOOLBAR)
i1 = IMAGE(data_f1, MIN_VALUE=0, MAX_VALUE=1, MARGIN=0, /CURRENT)

 

 

이러한 이미지에 대하여 Dilation 기법을 적용해봅시다. 역시 Erosion의 경우와 마찬가지로 Dilation에서도 먼저 구조화 요소를 정의하는 것이 필수입니다. 그 과정은 다음과 같이 처리해보았습니다.
 
r = 2

disc = SHIFT(DIST(2*r+1), r, r) LE r

HELP, disc

PRINT, disc
 
이와 같이 5x5의 구조를 갖는 2차원 배열로 정의된 disc가 구조화 요소의 역할을 하게 됩니다. 이 배열은 1 또는 0의 값들로 구성되며 그 모습은 다음과 같습니다.
 
   0   0   1   0   0

   0   1   1   1   0

   1   1   1   1   1

   0   1   1   1   0

   0   0   1   0   0
 
여기서 값이 1인 부분들만 보면 마치 마름모와 같은 형태인데, 사실은 원형에 가까운 형태로 구조화 요소를 정의하고자 한 것입니다. 물론 배열의 크기 자체가 5x5이기 때문에 원의 굴곡과 같은 패턴까지 세세하게 반영되기는 어렵지만 최대한 비슷하게 맞춰서 정의한 것입니다. 이렇게 구조화 요소를 정의하면 실제로 Dilation의 과정에서는 구조화 요소보다 작은 틈새 또는 사이 공간들은 채워지고 형체들은 더 확장되어서 그 크기가 커지는 효과를 얻게 됩니다. 그리고 변수 r의 값을 늘리면 구조화 요소 배열의 크기도 더 커지게 되는데, 구조화 요소 배열의 크기 및 패턴에 따라서 최종 결과도 달라지게 된다는 것을 유의해야 합니다. 일단 여기서는 r을 2로 정의해놓고 작업을 진행하기로 합니다. 그러면 앞서 마스킹 처리를 거쳐서 얻은 data_f1에 대하여 Dilation 처리를 해봅시다. 이를 위해서는 DILATE 함수를 다음과 같이 사용하면 됩니다.
 
data_f2 = DILATE(data_f1, disc)
 
이와 같이 Dilation 처리를 거쳐 얻은 결과인 data_f2를 다음과 같은 과정에 의하여 표출해봅시다.
 
win2 = WINDOW(DIMENSIONS=sz, /NO_TOOLBAR)

i2 = IMAGE(data_f2, MIN_VALUE=0, MAX_VALUE=1 , MARGIN=0, /CURRENT)

 

 

이 표출 결과를 보면 Dilation 처리의 효과가 어떤 것인지 알 수 있습니다. 즉 구조화 요소보다 작은 틈새들은 모두 채워지고 이미지 내 여러 형체들은 외곽 부분에 살이 붙으면서 크기가 더 커진 모습이 보입니다. 그리고 구조화 요소보다 더 큰 틈새들의 경우도 그 크기가 줄어든 것을 볼 수 있습니다. 따라서 Dilation 기법이 이미지 처리에 있어서 어떤 역할을 하는가에 대해서는 이러한 결과를 통해서 충분히 이해를 도울 수 있을 것으로 보입니다. 다만 이 결과만 봐서는 과연 Dilation이라는 처리 기법이 어떤 장점이 있는가에 대해서 약간 의아할 수도 있을 것 같습니다. 그래서 이번에는 약간 다른 시도를 해보고자 합니다. 즉 원본 이미지를 마스킹 처리한 이미지인 data_f1에 대하여 Erosion 처리를 먼저 수행하고 그 결과에 대하여 바로 이어서 Dilation 처리를 해보고자 합니다. 따라서 앞서 구조화 요소 disc를 정의했던 부분에서 바로 이어지는 내용을 다음과 같이 수정해봅시다.

 

data_f2 = ERODE(data_f1, disc)

win2 = WINDOW(DIMENSIONS=sz, /NO_TOOLBAR)

i2 = IMAGE(data_f2, MIN_VALUE=0, MAX_VALUE=1 , MARGIN=0, /CURRENT)

data_f3 = DILATE(data_f2, disc)
win3 = WINDOW(DIMENSIONS=sz, /NO_TOOLBAR)
i3 = IMAGE(data_f3, MIN_VALUE=0, MAX_VALUE=1 , MARGIN=0, /CURRENT)

 

여기서는 data_f1에 대하여 Erosion 기법을 적용하여 그 결과를 data_f2로 얻고, 이 결과에 대하여 바로 Dilation 기법을 적용하여 그 결과를 data_f3으로 얻은 것입니다. 여기서 표출된 data_f2 및 data_f3의 모습은 다음과 같습니다.

 

 

이와 같이 data_f1에 대하여 Erosion 처리를 먼저 하고 Dilation 처리를 한 최종 결과를 보면, 앞서 data_f1에 대하여 바로 Dilation 처리만 했던 경우에 비하면 뭔가 좀 더 정돈된 느낌이 드는 것 같습니다. 그럴 수 밖에 없는 것이, Erosion 처리를 먼저 수행하여 자잘하고 불필요한 작은 형체들을 먼저 걸러낸 다음에 Dilation 처리를 해주면 내가 관심있는 형체들만 추려내는 효과를 얻을 수 있기 때문입니다. 이것은 data_f1과 data_f3을 바로 비교해보면 더 느낌이 올 것입니다.

 

 

만약 이러한 흑점 이미지에서 어느 정도 이상의 크기를 갖는 흑점 형체들을 추려내는 것이 유저의 의도였다고 한다면, 방금과 같이 Erosion과 Dilation 처리의 조합에 의하여 어느 정도는 그 목적을 달성할 수 있다는 것을 위의 예제를 통하여 확인할 수 있습니다.

 

그러면 IDL에서 형태학적 이미지 처리를 수행하는 다양한 방법들에 관한 내용은 다음 회차에서도 계속 이어서 소개해보기로 하겠습니다.

반응형