IDL/Image Processing

MORPH_GRADIENT 함수 소개

이상우_idl 2024. 7. 18. 16:56
728x90
반응형

2차원 이미지에 대한 처리 기법들 중에는 특정한 형태(Shape or Morphology)를 갖는 형체들(Features)을 기반으로 분석 및 처리를 수행하는 기법들이 있습니다. 이러한 기법들을 총괄적으로는 흔히 형태학적 이미지 처리(Morphological Image Processing) 기법이라고 부릅니다. 이러한 기법들은 기본적으로는 컨볼루션(Convolution)을 기반으로 하는데, 이 때 적용되는 커널(Kernel)의 형태 그리고 컨볼루션을 적용하는 횟수 및 순서 등에 따라 여러가지 변형 기법들로 나눠지게 됩니다. 예를 들면 Erosion, Dilation, Opening, Closing 등의 기법들입니다. IDL에서도 이러한 형태학적 이미지 처리 기법을 기반으로 하는 여러가지 기능 함수들이 지원되고 있습니다.

 

오늘은 그 중에서 MORPH_GRADIENT 함수를 소개해볼까 합니다. 원래 Gradient라는 용어 자체는 기울기, 경사, 변동폭 등과 같은 의미라고 볼 수 있는데, 실제로 이 함수는 이미지에 대하여 화소값이 변동되는 정도를 전체적으로 계산하여 변동이 심한 부분 및 약한 부분을 탐색하는 역할을 합니다. 어떻게 보면 경계선 추출(Edge Detection)과 유사한 작업이라고 볼 수도 있습니다. 그러면 MORPH_GRADIENT 함수의 역할 및 사용법을 예제와 함께 살펴봅시다. 예제로 사용할 이미지는 IDL에서 기본적으로 제공되는 이미지 파일들 중 하나인 pollens.jpg를 사용하기로 합니다. 이 파일을 읽어서 data라는 이미지 배열로 가져오는 과정은 다음과 같습니다.

 

path = FILEPATH('pollens.jpg', SUBDIR=['examples', 'demo', 'demodata'])
READ_JPEG, path, data

HELP, data
PRINT, MIN(data), MAX(data)

 

여기서 HELP 및 PRINT에 의하여 출력된 내용을 보면 data는 320x240의 구조를 가지는 2차원 배열이며 30~255의 범위를 갖는 바이트형 값들로 구성된 배열임을 알 수 있습니다. 여기서 일단 원본 이미지의 모습을 표출해봅시다. 그 과정은 다음과 같이 처리해봅니다.

 

sz = SIZE(data, /DIM)
win0 = WINDOW(DIMENSIONS=sz, /NO_TOOLBAR)
i1 = IMAGE(data, MARGIN=0, /CURRENT)

 

표출된 모습은 다음과 같습니다.

 

이제 이러한 이미지 데이터에 대하여 MORPH_GRADIENT 함수를 적용해야 하는데요. 이 함수에 투입되어야 하는 필수 인수들은 두가지입니다. 먼저 첫번째 인수는 처리 대상이 될 이미지 데이터 배열로서 여기서는 배열 data가 됩니다. 그리고 두번째 인수는 소위 구조화 요소(Structuring Element)에 해당되는 배열이 되어야 하는데, 형태학적 이미지 처리에 있어서 그 기반이 되는 커널과 같은 요소라고 보면 됩니다. 여기서는 구조화 요소를 다음과 같이 disc라는 이름의 2차원 배열로 정의해봅시다.

 

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

PRINT, disc

 

이와 같이 5x5의 구조를 갖는 2차원 배열이며, 실제로 PRINT에 의하여 출력된 이 배열의 모습은 다음과 같습니다.

 

   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

 

이와 같이 0 또는 1의 값들로 구성되어 있고 전체적인 패턴은 마치 마름모 또는 원형에 가깝다고 볼 수 있습니다. 실제로 MORPH_GRADIENT 함수를 비롯하여 형태학적 이미지 처리 기법을 수행하는 다른 함수들 역시 이와 같이 대상 이미지 배열 및 구조화 요소를 필수적인 인수들로 받아야 한다는 것을 유의해야 합니다. 그리고 구조화 요소의 크기 및 형태에 따라서 결과가 달라질 수 있기 때문에, 데이터의 특성에 맞는 구조화 요소를 정의하고 적용시키는 것이 중요한 과제이기도 합니다. 어쨌든 여기서는 위와 같이 정의된 배열 disc를 구조화 요소로 사용하기로 합니다. 이제 MORPH_GRADIENT 함수를 사용하여 처리를 하고 그 결과를 살펴봅시다. 그 과정은 다음과 같습니다.

 

  data_f = MORPH_GRADIENT(data, disc)
  HELP, data_f
  PRINT, MIN(data_f), MAX(data_f)

 

이와 같이 처리 결과에 해당되는 배열인 data_f를 얻고 그 정보를 확인해보면 당연히 구조 자체는 원본 배열과 동일한 320x240이고 다만 값 범위는 0~255임을 알 수 있습니다. 그러면 이 결과를 별도의 그래픽 창에 표출해봅시다.

 

win1 = WINDOW(DIMENSIONS=sz, /NO_TOOLBAR)
i1 = IMAGE(data_f, MARGIN=0, /CURRENT)

 

그 모습은 다음과 같습니다.

 

이 모습을 잘 보면 원본 이미지에서 화소값의 변동이 큰 부분은 밝게 보이고 변동이 적은 부분은 덜 밝게 보입니다. 즉 원본 이미지 내에서 화소값의 변동폭 또는 기울기(Gradient)에 대한 탐색의 결과를 얻은 것이라고 보면 됩니다. 만약 여기서 화소값의 변동이 가장 강한 부분들만 강조하여 보고 싶다면 다음과 같이 data_f에 대하여 클리핑(Clipping) 기법을 적용하여 그 결과를 별도로 표출해보면 됩니다.

 

  win2 = WINDOW(DIMENSIONS=sz, /NO_TOOLBAR)
  i2 = IMAGE(data_f>70, MARGIN=0, /CURRENT)

 

표출된 모습은 다음과 같습니다.

 

이와 같이 MORPH_GRADIENT 함수는 형태학적 이미지 처리 기법들 중에서도 이미지 내 화소값들의 국지적인 변동폭의 강도를 탐색하는 역할을 합니다. 결과적으로는 이미지 내 형체들의 윤곽선 또는 경계선을 탐지하는 작업(Edge Detection)과 유사하다고 봐도 될 것 같습니다. 경계선 탐지에 관해서는 제가 예전에 관련 게시물을 올린 바 있습니다. 당시 이 게시물에서는 ohare_small.jpg라는 공항 상공 이미지를 예제 데이터로 사용하였었는데요. 오늘 소개한 MORPH_GRADIENT 함수에 그 이미지를 간단히 적용해본 결과는 다음과 같았습니다.

 

이 모습을 보면 당시의 게시물에서 ROBERTS 또는 SOBEL 함수를 적용하여 경계선을 탐지한 결과와 유사한 느낌이 들기도 합니다. 물론 앞서 언급했듯이 MORPH_GRADIENT 함수에 투입되는 구조화 요소의 형태에 따라서는 또 다른 결과를 얻을 수도 있으므로 다양한 시도를 해보는 것도 좋을 것 같습니다.

 

오늘은 IDL에서 지원되는 형태학적 이미지 처리 함수들 중 MORPH_GRADIENT 함수를 소개해보았습니다. 물론 IDL에서는 이외에도 여러가지 흥미로운 형태학적 이미지 처리 기법들이 다양하게 지원되기 때문에 그러한 기능 함수들에 대해서도 차후에 기회가 닿는대로 또 소개해보기로 하겠습니다.

반응형