IDL/Image Processing

THIN 함수를 소개합니다 (Part 1)

이상우_idl 2014. 6. 12. 21:10
728x90
반응형

오늘은 IDL의 이미지 처리 관련 내장함수들 중 THIN이라는 이름의 함수를 소개해볼까 합니다. 말 그대로 뭔가를 가느다랗게(thin) 만들어내는 역할을 하는 함수인데요. 좀 더 구체적으로 얘기한다면, 이미지상의 어떤 형체를 선형으로 환산하는 기능을 수행합니다. 즉, 형체의 뼈대(Skeleton)를 추출하는 역할을 합니다. 예제 하나를 보면서 설명을 해보겠습니다. 다음 그림은 제가 태블릿 PC에서 그림 그리는 앱을 하나 띄우고 제 이름을 그냥 휘갈겨쓴 것을 그림 파일로 저장한 것입니다. 요즘 다들 태블릿 PC들 많이 쓰실 것이고 이런 앱은 어렵지 않게 찾을 수 있기 때문에 아마 여러분들도 금방 하나 만드실 수 있을 것입니다. 저는 JPG 형식의 그림 파일로 저장했고 파일 이름은 'my_paint.jpg'입니다.

 

my_paint.jpg

 

 

이번 예제에서는 이 그림상에 존재하는 글자의 형체에 THIN 함수를 적용하여 선형의 뼈대만 추출해보고자 합니다. 따라서 예제 IDL 프로그램의 앞부분에서는 다음과 같은 내용을 실행하여 이 JPG 파일을 읽고 원본 그대로 간단하게 표출을 먼저 해봅니다. 물론 이 결과는 당연히 위의 그림과 같습니다. 여기서는 READ_JPEG 명령을 사용하여 JPG 형식의 그림 파일을 읽었는데, 하나 유의할 점은 /GRAY라는 키워드를 함께 사용함으로써 이미지 배열이 24비트(RGB)가 아닌 8비트(단색광)의 화소값들을 갖도록 했다는 점입니다. 이렇게 읽어야 나머지 과정의 처리 작업이 쉬워집니다.

 

ifile = 'my_paint.jpg'
READ_JPEG, ifile, img, /GRAY
HELP, img
sz = SIZE(img, /DIM)
WINDOW, 0, XSIZE=sz[0], YSIZE=sz[1]
TV, img

그 다음 단계에서는 바로 THIN 함수가 나오........면 좋겠지만, 이 함수 사용 이전에 하나 거쳐가야 하는 단계가 있습니다. THIN 함수에 인자로 들어갈 이미지는 바이너리(Binary) 이미지, 즉 화소값이 0 또는 1만 존재하는 형태여야 합니다. 우리가 흔히 마스킹(Masking)이란 기법을 이미지에 적용하여, 내가 원하는 조건을 만족하는 화소들만 값이 1이 되도록 하고 나머지는 0이 되게 하는 처리를 하는데, 이런 처리의 결과가 바로 바이너리 이미지가 됩니다. 그러니까 위에 있는 원본 이미지를 그렇게 처리해야 한다는 뜻인데요. 일단 처리 방법부터 소개하면 다음과 같습니다. 그러면 다음 그림과 같은 결과를 얻게 됩니다.

 

WINDOW, 1, XSIZE=sz[0], YSIZE=sz[1]

mask = img LE 200
TVSCL, mask

 

 

방금 소개되었듯이 이미지 배열 자체에 조건논리식을 바로 이어 붙여서 그 조건을 만족하는 화소와 그렇지 않은 화소를 1과 0이란 값로 구분해내는 기법을 마스킹(Masking)이라고 합니다. 여기서는 원본 이미지상의 화소값이 200보다 작거나 같은 부분만 골라낸 셈입니다. 왜냐하면 원본 이미지상에서 실제 글자에 해당되는 부분은 화소값이 완전 검은색부터 약간 어두운 회색에 해당되는 비교적 작은 값들에 대응되는데, 글자와 배경을 구분하는 경계값을 200으로 간주한 것입니다. 물론 이 경계값의 결정은 프로그래머의 판단이 필요한 부분입니다. 어쨌든 이런 마스킹 처리를 거치면 화소값이 200보다 작거나 같은 어두운 부분들은 1, 나머지 배경에 해당되는 밝은 부분들은 0이라는 값을 갖는 mask라는 배열이 얻어집니다. 이 mask를 표출한 것이 위의 그림입니다. 여기서는 흰 부분이 글자 자체, 검은 부분은 배경에 해당됩니다.

 

이제는 THIN 함수를 사용할 준비는 다 끝났습니다. 앞서 얻은 마스킹 처리 결과인 mask를 다음과 같이 THIN 함수에 투입하면 됩니다. 이 함수의 사용법은 보시다시피 간단합니다만, 앞서와 같이 Binary 이미지를 먼저 만들어야 하는 과정을 거쳐야 한다는 점만 유념하면 됩니다. 이제 THIN 함수를 적용한 결과는 다음 그림과 같이 나타납니다.

 

WINDOW, 2, XSIZE=sz[0], YSIZE=sz[1]
mask_thin = THIN(mask)
TVSCL, mask_thin

 

 

어떻습니까? 원본 이미지상에서는 글자의 선이 어느 정도 두께를 갖고 있었던 반면, THIN 함수를 적용한 결과는 바로 위 그림에서처럼 선형으로 나타납니다. 이와 같이 THIN 함수는 일정한 폭과 크기를 갖는 다양한 형체들의 모양을 단순한 선형으로 변환하는 역할을 수행합니다. 그렇다면 이렇게 형체의 모양을 선형으로 변환하는 작업이 왜 필요하냐는 의문이 생길 수 있습니다. 물론 다양한 목적들이 있을 수 있겠고, 저라고 그 모든 경우들을 다 알지는 못합니다. 하지만 하나 떠올려보면, 필적 감정과 같은 이른바 패턴 인식(Pattern Recognition) 계열의 작업에서 유용하게 사용될 수 있을겁니다. 그리고 자료의 성격상 선형의 윤곽이 매우 중요한 경우들도 있을 수 있고요. 물론 저같은 경우도 이렇게 선형의 윤곽을 잡는 것이 중요한 형체에 대한 분석 및 처리 작업을 하는 과정에서 아주 유용하게 사용하고 있습니다. 이미지 처리(Image Processing)에서 형태 인식 및 추출 계열의 작업에서 매우 유용하게 사용될 수 있는 기능입니다.

 

사실 THIN 함수의 역할은 위와 같이 선형으로 그림만 다시 그려주는데에서 끝나지는 않습니다. 저 결과를 다시 데이터의 형태로 가져올 수가 있게 해주는 기능도 있는데요. 이와 관련된 내용은 조만간 이어지는 게시물에서 다뤄보도록 하겠습니다.

my_paint.jpg
0.04MB
반응형