IDL/Image Processing

ERODE 함수 소개

이상우_idl 2024. 7. 25. 15:22
728x90
반응형

제가 얼마전에 MORPH_GRADIENT 함수를 소개하는 게시물을 올리면서 거기서 형태학적 이미지 처리(Morphological Image Processing, 이후부터는 MIP로 줄여서 부릅니다)라는 개념에 관하여 언급을 한 바 있습니다. 그 이유는 MORPH_GRADIENT 함수의 이미지 처리 알고리즘이 MIP의 범주에 속하는 여러가지 기법들 중 하나였기 때문입니다. 그리고 IDL에서는 MIP에 속하는 여러가지 기법들이 반영된 기능 함수들이 다양하게 지원되고 있다는 것도 함께 언급하였는데요. 이러한 범주에 속하는 여러 기능 함수들 중에는 ERODE 및 DILATE 함수가 있습니다. 이 함수들은 각각 Erosion 및 Dilation이라는 기법에 해당되는 기능을 수행하는데, 굳이 우리말로 번역해본다면 Erosion은 침식 그리고 Dilation은 확장 정도로 생각하면 될 것 같습니다. 사실 이 두 기법들은 MIP를 이해하는데 있어서 기본 뼈대라 할 수 있고, 이 기법들을 바탕으로 하는 더 발전된 기법들도 여러가지가 있습니다. 그래서 이 두 함수의 개념 및 적용 방법을 소개해보고자 합니다. 오늘은 먼저 ERODE 함수를 사용하여 Erosion 기법을 적용하는 방법을 예제와 함께 살펴보기로 하겠습니다.

 

먼저 Erosion(침식) 기법은 용어 자체의 뜻만으로 보면 뭔가를 깎아낸다는 의미로 보입니다. 실제로 이미지 처리에 있어서 이 기법은 이미지 내에 존재하는 형체들을 깎아내어서 그 크기를 감소시키거나 아예 제거한다는 의미로 이해하면 됩니다. IDL에서는 ERODE 함수가 그러한 역할을 합니다. 이 함수를 사용하는 문법은 다음과 같습니다.

 

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

 

이와 같이 ERODE 함수에는 반드시 두 개의 인수들이 투입되어야 합니다. 먼저 첫번째 인수는 대상이 될 이미지 배열입니다. 그리고 두번째 인수는 구조화 요소(Structuring Element)라고 부르는 배열로서, 첫번째 인수로 투입될 대상이 2차원 이미지 배열이라면 구조화 요소 역시 2차원 배열로 정의되어야 합니다. 구조화 요소라는 개념은 MIP에서 이미지 내의 형체들을 처리하는데 있어서 기준이 되는 형체라고 보면 되는데요. 침식 기법에 있어서 구조화 요소의 역할은 마치 형체를 깎아내는 도구와 같다고 볼 수 있습니다. 즉 구조화 요소보다 더 작은 형체들은 제거되고, 구조화 요소보다 더 큰 형체들은 제거까지는 안되지만 그만큼 깎여나가서 크기가 줄어들게 됩니다. 이해를 돕기 위하여 구체적인 예제를 살펴봅시다. 예제로 사용할 이미지 데이터는 제가 예전에 다른 게시물에서도 사용했던 태양 흑점 이미지입니다. 이미지 파일은 아래에 첨부하였습니다.

 

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)

 

 

이러한 이미지에 대하여 Erosion 기법을 적용하고자 하는데요. 다만 여기서는 다음과 같이 원본 이미지에 대하여 마스킹(Masking) 처리를 먼저 진행하는 것을 권장합니다. 그 이유는 마스킹 처리가 된 결과 이미지는 0 또는 1의 값들로만 구성된 바이너리(Binary) 이미지가 되는데, 이러한 바이너리 이미지에 대하여 ERODE 함수를 적용하는 것이 이해를 돕는데 있어서 더 유리할 것 같기 때문입니다(물론 ERODE 함수는 원본 이미지와 같은 그레이스케일(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)

 

 

마스킹 처리가 된 이미지를 보면 원본 이미지 상에서 흑점에 해당되는 형체들이 어느 정도 식별된 것이 보입니다. 그런데 문제는 흑점 뿐 아니라 주변부에 작고 자잘한 점들도 많이 보인다는 것입니다. 이것은 180이라는 화소값을 기준으로 마스킹을 하다보니 관심 형체인 흑점 뿐 아니라 관심 밖의 자잘한 형체들까지도 함께 식별되는 경우입니다. 실제로 이미지 내에서 내가 관심있는 형체들을 화소값만을 기준으로 판별하는 경우에는 이러한 일이 흔히 발생합니다. 어쨌든 이러한 이미지에 대하여 Erosion 기법을 적용해봅시다. 이를 위해서는 먼저 구조화 요소를 정의하는 것이 필수입니다. 그 과정은 다음과 같이 처리해보았습니다.

 

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이기 때문에 원의 굴곡과 같은 패턴까지 세세하게 반영되기는 어렵지만 최대한 비슷하게 맞춰서 정의한 것입니다. 이렇게 구조화 요소를 정의하면 실제로 Erosion의 과정에서는 구조화 요소보다 작은 형체들은 제거되고 더 큰 형체들은 깎여나가서 그 크기가 작아지는 효과를 얻게 됩니다. 그리고 변수 r의 값을 늘리면 구조화 요소 배열의 크기도 더 커지게 되는데, 구조화 요소 배열의 크기 및 패턴에 따라서 최종 결과도 달라지게 된다는 것을 유의해야 합니다. 일단 여기서는 r을 2로 정의해놓고 작업을 진행하기로 합니다. 그러면 앞서 마스킹 처리를 거쳐서 얻은 data_f1에 대하여 Erosion 처리를 해봅시다. 이를 위해서는 ERODE 함수를 다음과 같이 사용하면 됩니다.

 

data_f2 = ERODE(data_f1, disc)

 

이와 같이 Erosion 처리를 거쳐 얻은 결과인 data_f2를 다음과 같은 과정에 의하여 표출해봅시다.

 

win2 = WINDOW(DIMENSIONS=sz, /NO_TOOLBAR)
i2 = IMAGE(data_f2, MIN_VALUE=0, MAX_VALUE=1 , MARGIN=0, /CURRENT)

 

 

이 표출 결과를 보면 Erosion 처리의 효과가 어떤 것인지 알 수 있습니다. 즉 크기가 작은 자잘한 형체들은 제거되었지만 더 큰 형체들도 외곽 부분이 깎여나가면서 크기가 줄어든 것이 보입니다. 이것은 Erosion 기법의 특성상 당연한 결과인데요. 만약 큰 형체들은 관심 형체로서 살리고 자잘한 형체들은 관심밖 형체로서 제거하는 것이 유저의 의도였다면, 크기가 작은 관심밖 형체들의 제거라는 목적은 달성하였지만 크기가 큰 관심 형체들에 대한 정보까지도 Erosion 처리에 의하여 일정 부분 손실되었음을 볼 수 있습니다. 따라서 Erosion 기법에 의한 처리만으로는 뭔가 의미있는 결과를 얻기가 힘들 가능성이 높습니다. 물론 여기서 끝은 아닙니다. 서두에서 잠시 언급되었고 차후에 소개될 예정인 Dilation 기법과의 조합에 의하여 좀 더 유용하고 의미있는 처리가 가능해질 것입니다. 오늘은 일단 ERODE 함수를 사용하여 Erosion 기법에 의한 처리를 하는 방법 및 그 결과를 예제와 함께 살펴보는 정도로 마무리를 하고, 다음 회차에서는 DILATE 함수를 사용하여 Dilation 기법에 의하여 이미지를 처리하는 방법을 예제와 함께 소개해보기로 하겠습니다.

반응형

'IDL > Image Processing' 카테고리의 다른 글

MORPH_OPEN 및 MORPH_CLOSE 함수 소개  (0) 2024.08.08
DILATE 함수 소개  (0) 2024.08.01
MORPH_GRADIENT 함수 소개  (0) 2024.07.18
특정 화소들만 강조한 이미지의 표출  (1) 2024.06.13
IDL 8.9의 Gabor Filter 기능 소개  (0) 2023.07.04