본문 바로가기

학습컨텐츠/이미지프로세싱

영역 기반 처리 - (4) 경계선 찾기


  경계선 찾기는 상대적으로 다른 색을 가진 두 영역간의 경계를 찾는 것을 말한다. 경계선은 물체의 위치, 형태, 크기 등 영상에 대한 많은 정보를 제공할 수 있으며, 물체 인식을 비롯한 여러 분야에 응용될 수 있다.

  경계선 검출은 이웃한 두 영역의 차이를 계산하는 것으로 가능하다. 아래처럼 경계선이 뚜렷한 이미지를 생각하자. 왼쪽에서 오른쪽으로 가면서 픽셀값을 그래프로 그리면 아래와 같을 것이다. 이제 픽셀값의 차이를 알아내기 위해 좁은 간격을 두고 픽셀값들의 차이를 구해 보면, 그림에서처럼 경계 부분에서만 픽셀값의 차이가 두드러지는 것을 알 수 있다. 고등학교 과정의 '미분'과 같은 개념이다.


(그림 24) 경계선 찾기 기법의 원리


  미분 개념을 효과적으로 표현하기 위한 방법으로 회선 기법이 활용될 수 있다. 가로와 세로 두 방향에 대한 경계선을 모두 구하기 위해, 두 개의 회선 마스크를 적용하고 합성하는 방식을 이용한다. Prewitt와 Sobel이란 사람이 이를 위한 회선 마스크를 개발하여 각각에 Prewitt마스크, Sobel마스크라는 이름을 붙였다. 이름만 거창하지, 여러분들도 충분히 떠올릴 수 있는 마스크이다.



수평 경계선 찾기

수직 경계선 찾기

Prewitt 마스크


-1

-1

-1

0

0

0

1

1

1



1

0

-1

1

0

-1

1

0

-1


Sobel 마스크


-1

-2

-1

0

0

0

1

2

1



1

0

-1

2

0

-2

1

0

-1



  Prewitt 마스크는 앞서 설명했던 방식 그대로 수직과 수평 방향의 미분값을 찾기 위한 마스크이고, Sobel은 여기서 한 단계 더 나아가 마스크의 중심에 가까운 픽셀에 조금 더 큰 값을 주는 것으로 더 정확한 경계선을 검출할 수 있게 했다. 이는 회선 연산에서 중심 화소에 가까운 픽셀일수록 영향을 더 많이 받아야 한다는 기본 특성이 있기 때문이다.

  또 한가지 주목할 것은, 이번엔 마스크를 이루는 숫자들의 합이 1이 아니라 0이라는 점이다. 흐리게 또는 선명하게 효과를 적용하는 마스크는 주변 픽셀들의 가중평균(Weighted Average)을 구하는 과정이었으나, 이번엔 주변 픽셀값들의 차이를 구하는 과정이기 때문에, 1이 아니라 0이 된다. 쉬운 예로 이미지 전체가 한 가지 색으로 이루어진 경우를 생각해 보자. 단색 이미지에 아무리 흐리게나 선명하게 효과를 주어도 결과 이미지는 그대로일 것이다. 하지만 경계선이 존재하지 않는 이 이미지에 경계선 찾기 회선 마스크를 적용하면 결과는 0(검정색)이 나와야 마땅하다.

  이미지에 Prewitt나 Sobel 마스크를 적용하여 수평과 수직 경계선의 분포를 구하고, 이것을 Ex, Ey라고 하자. 최종 결과 이미지 E는 아래와 같은 공식에 의해 주어진다.

사용자 삽입 이미지

  눈치챘겠지만, 이것은 피타고라스 공식과 같다. 각 마스크로 구해진 결과는 각 위치에서의 가로 방향, 세로 방향으로의 픽셀값의 변화의 정도를 의미한다. 따라서 모든 방향을 고려해서 픽셀 변화의 정도를 측정하려면 피타고라스 공식을 이용하는 것이 적절하다. 수학적으로 말하면, E는 이미지의 그래디언트의 절대값이고, Ex와 Ey는 이미지의 편미분값이기 때문이라고 할 수 있는데, 이에 대한 설명은 생략하도록 하자.

  PIL은 경계선을 찾는 기능도 제공한다. PixelAccess 객체를 직접 이용하여 회선 마스크를 적용하는 방법은 충분히 파악했다고 보고, PIL의 함수만 소개한다. 다음 코드를 실행하면 고양이 사진의 경계선 분포를 edgecat.bmp으로 저장할 수 있다.



import Image, ImageFilter
cat=Image.open("cat.bmp")
cat.filter(ImageFilter.FIND_EDGES).save("edgecat.bmp")


  단 세 줄이면 된다. edgecat.bmp는 아래와 같다.


(그림 25) 고양이 사진의 경계선을 찾은 모습