IDL/Image Processing

MORPH_OPEN 및 MORPH_CLOSE 함수 소개

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

얼마전부터 형태학적 이미지 처리(Morphological Image Processing, MIP)의 범주에 속하는 여러가지 기법들을 지원하는 IDL 함수들을 소개하고 있습니다. 최근 2회에 걸쳐서는 Erosion(침식) 기법에 해당되는 ERODE 함수 및 Dilation(확장) 기법에 해당되는 DILATE 함수를 차례로 소개한 바 있습니다. 특히 지난 회차 게시물에서는 DILATE 함수를 사용하는 방법을 먼저 소개한 후 ERODE 및 DILATE 함수를 조합하여 사용하는 처리 방식도 함께 살펴본 바 있습니다. 즉 이미지에 대하여 ERODE 함수를 먼저 사용하여 Erosion 처리를 한 후 이어서 DILATE 함수를 사용하여 Dilation 처리를 수행하는 처리 방법이었습니다. 그리고 이러한 방식의 처리의 대상 및 그 결과 이미지는 각각 다음과 같았습니다.

 

 

그런데 이와 같이 Erosion 처리를 먼저 수행하고 바로 이어서 Dilation 처리를 수행하는 경우에 해당되는 기법의 명칭이 따로 있습니다. 즉 이러한 기법을 Morphological Opening 기법이라고도 부릅니다. 그리고 IDL에서도 이러한 역할을 수행하는 MORPH_OPEN 함수를 별도로 지원합니다. 따라서 위와 같이 ERODE 및 DILATE 함수를 차례로 사용했던 작업은 MORPH_OPEN 함수만으로도 한방에 처리가 됩니다. 지난 회차 게시물의 내용을 바탕으로 이러한 방식으로 처리를 해본다면 그 과정은 다음과 같습니다.

 

READ_PNG, 'sunspots.png', data

data_f1 = data LT 180

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

 

여기까지는 원본 이미지 파일을 읽어서 클리핑 처리를 한 data_f1을 얻고, 구조화 요소 배열 disc를 정의하는 과정입니다.

 

data_f4 = MORPH_OPEN(data_f1, disc)
HELP, data_f4
PRINT, MIN(data_f4), MAX(data_f4)
win4 = WINDOW(DIMENSIONS=sz, /NO_TOOLBAR)
i4 = IMAGE(data_f4, MIN_VALUE=0, MAX_VALUE=1, MARGIN=0, /CURRENT)

 

이와 같이 MORPH_OPEN 함수에 data_f1 및 disc를 투입하여 Morphological Opening 처리를 수행하고 그 결과를 data_f4라는 배열로 얻습니다. 이렇게 얻은 data_f4를 표출해보면 앞서 ERODE 및 DILATE 함수를 차례로 사용하여 얻었던 결과와 동일합니다.

 

따라서 MORPH_OPEN 함수의 역할은 "ERODE 함수 다음 DILATE 함수"와 동일하다고 보면 됩니다. 그리고 위의 결과 그림을 보면 MORPH_OPEN 함수가 수행하는 Morphological Opening이라고 하는 형태학적 이미지 처리 기법의 효과가 어떤 것인가에 대하여 대략적으로 이해가 가능할 것 같습니다. 즉 이러한 기법의 효과는 이미지 내에서 자잘하고 불필요한 요소들은 최대한 걸러내고 일정한 크기 이상의 관심 형체들만 추려내는 것이라고 보면 됩니다.

 

그런데 여기서 잠시 생각을 전환해본다면, 순서를 뒤집어서 Dilation을 먼저 수행하고 Erosion을 나중에 수행하는 경우도 생각해볼 수 있지 않을까요? 당연히 그러한 처리 방식도 있습니다. 이러한 처리 기법을 Morphological Closing이라고 부릅니다. 이러한 기법의 처리를 위해서는 이미지에 대하여 DILATE 함수를 먼저 사용한 후 ERODE 함수를 이어서 사용해도 되지만, 이러한 과정을 한방에 처리하는 MORPH_CLOSE 함수를 사용해도 됩니다. 그러면 이러한 방식의 처리 예제를 살펴봅시다. 이번에는 다른 이미지 자료를 사용해보고자 합니다. 해당 이미지 파일을 열고 원본 그대로 표출하는 과정부터 시작해보면 그 내용은 다음과 같습니다.

 

file = FILEPATH('mineral.png', SUBDIRECTORY = ['examples', 'data'])
data = READ_PNG(file)

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

 

여기서 사용된 이미지 데이터를 보면 크기가 288x216으로 꽤 작은 편인 바이너리 이미지입니다. 일단 이러한 과정에 의하여 표출된 그 모습은 다음과 같습니다.

 

이제 이러한 이미지에 대하여 Morphological Closing 기법을 적용하기 위하여 MORPH_CLOSE 함수를 사용하고자 합니다. 일단 이러한 처리의 목표는 이미지 내에서 검고 어둡게 보이는 형체들을 관심 대상으로 가정하고 이러한 형체들만을 효과적으로 추려내는 것으로 정해봅시다. 일단 클리핑(Clipping) 기법을 동원하여 관심 형체를 1차적으로 걸러내는 과정부터 다음과 같이 진행해봅니다.

 

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

 

원본 이미지는 바이너리 이미지이고 화소값 범위가 0~255입니다. 관심 형체들의 경우는 화소값이 낮은 편이므로 일단 기준 화소값을 160으로 가정하고, 클리핑 처리에 있어서는 160보다 크냐 여부를 기준으로 해보았습니다. 이러한 과정을 거쳐 얻은 data_f1의 모습은 다음과 같습니다. 이렇게 하면 화소값이 160보다 크거나 같은 화소들은 흰색 그리고 그렇지 않은 화소들은 검은색으로 표시됩니다.

 

이와 같이 처리된 이미지에서는 검게 보이면서도 크기가 비교적 큰 것들이 관심 형체가 됩니다. 하지만 이러한 이미지 내에는 관심 형체들 외에도 자잘한 형체들이 마치 검은 줄무늬 또는 점들과 같은 모습으로 여기저기 흩어져 있는 것이 보입니다. 이러한 형체들을 제거하는 것이 이후의 처리의 핵심이 될 것입니다. 이러한 잡다한 형체들은 일종의 틈새 내지는 구멍과 같은 형태에 가깝기 때문에 이러한 틈새 및 구멍들을 채워주는 Dilation 처리 기법을 먼저 적용하면 거의 다 제거가 가능합니다. 그리고 바로 이어서 Erosion 처리를 해주면 관심 형체들의 원래 모습을 거의 복구할 수 있습니다. 이러한 순서의 처리가 바로 Morphological Closing이고 이러한 작업을 위해서는 MORPH_CLOSE 함수를 사용하면 됩니다. 다만 우리가 앞서 이미 사용해보았던 MORPH_OPEN 함수의 경우와 마찬가지로 MORPH_CLOSE 함수 역시 구조화 요소(Structuring Element)에 해당되는 배열을 정의하는 것이 필수입니다. 여기서는 이러한 구조화 요소 배열을 다음과 같이 정의해보았습니다.

 

side = 3

elem = DIST(side) LE side
HELP, elem
PRINT, elem

 

여기서 출력된 내용을 보면 구조화 요소 배열 elem의 구조 및 모습을 볼 수 있는데, 다음과 같습니다.

 

ELEM            BYTE      = Array[3, 3]
   1   1   1
   1   1   1
   1   1   1

 

여기서는 이와 같이 3x3의 구조를 갖는 사각형(Square)의 형태가 되도록 구조화 요소 배열을 정의해보았습니다. 앞서 우리가 Morphological Opening 작업에서 사용했던 구조화 요소 배열이 마름모 내지는 원형에 가까운 형태였던 반면, 이번에 Morphological Closing 작업에서는 위와 같이 사각형 형태의 구조화 요소 배열을 사용해보고자 합니다. 이제 다음 단계는 MORPH_CLOSE 함수를 사용하여 처리를 하고 그 결과를 표출하는 것으로서, 그 과정은 다음과 같습니다.

 

data_f2 = MORPH_CLOSE(data_f1, elem)
HELP, data_f2
PRINT, MIN(data_f2), MAX(data_f2)
win2 = WINDOW(DIMENSIONS=sz, /NO_TOOLBAR)
i2 = IMAGE(data_f2, MIN_VALUE=0, MAX_VALUE=1, MARGIN=0, /CURRENT)

 

이와 같이 data_f1에 대하여 MORPH_CLOSE 함수를 사용하여 얻은 결과 배열 data_f2의 모습은 다음과 같습니다.

 

이 그림을 보면 우리가 관심의 대상으로 간주했던 형체들만 거의 추려지고 나머지 자잘한 무관심 형체들은 거의 다 사라진 것을 볼 수 있습니다. 따라서 Morphological Closing 기법은 이러한 방식으로 적용을 하면 됩니다. 물론 이것은 단 하나의 예제에 불과할 뿐이며, 이미지 데이터의 특성 및 유저의 목적에 따라서 Opening을 할 것이냐 아니면 Closing을 할 것이냐의 여부 뿐 아니라 구조화 요소의 형태 및 크기 등도 얼마든지 달라질 수 있습니다.

 

지금까지 최근 4회에 걸쳐서 형태학적 이미지 처리(Morphological Image Processing, MIP) 기법 기반의 IDL 함수들 몇몇에 대하여 예제와 함께 소개를 해보았습니다. IDL의 MIP 기반 함수들은 그 외에도 더 있는데, 다른 함수들에 관해서는 나중에 기회가 되면 또 이어서 소개를 해볼 생각입니다. IDL의 MIP 기반의 기능 함수들에 대한 좀 더 자세한 내용은 IDL 도움말에서 Routines by Topic -> Image Processing -> Morphological Image Operators 섹션을 참조하거나 또는 IDL의 설치 디렉토리 내에서(Program Files\NV5\IDL90\help\pdf) image.pdf라는 문서의 Chapter 9의 내용을 참조하면 됩니다.

반응형