본문 바로가기

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

기하학적 처리 - (2) 축소


  축소를 위한 기본적인 개념은 확대의 경우와 같다. 다만 축소의 경우에는 원래 이미지에서 적절한 데이터를 간추려내는 것이므로, 원래 이미지에는 포함되어 있지 않던 새로운 데이터를 계산하지 않아도 확대에서처럼 픽셀이 커져서 눈으로 보인다든지 하는 일은 없다. 사진의 경우 nearest neighbor method를 사용해도 큰 무리가 없이 축소가 가능하다. Magnify함수에 1보다 작은 배율을 주는 방법도 있다.

  다만 글자나 도면처럼 얇은 선을 포함하는 그림의 경우 문제가 생긴다. 아래 그림을 nearest neighbor method를 이용해서 축소해보자.


(그림 30) 얇은 선들로 이루어진 이미지의 예


(그림 31) nearest neighbor 방식으로 그림 30을 축소한 결과


  bilinear interpolation을 써도 상황은 비슷하다.


(그림 32) bilinear interpolation으로 그림 30을 축소한 결과


  이런 문제는 입력 이미지의 픽셀이 띄엄띄엄 선택되어 결과 이미지로 들어가기 때문에 일어난다. 가장 간단하게 해결할 수 있는 방법은 흐리게 효과를 준 다음에 축소하는 것이다.


(그림 33) 흐리게 효과를 준 뒤 이미지를 축소한 결과


  부드러운 이미지 확대/축소에 사용되는 방법을 통틀어 anti-aliasing이라고 하며, 흐리게 효과를 주는 방법 이외에도 상황에 따라 많은 방법들이 사용되고 있다. PIL에서는 빠른 속도로 이미지의 크기를 변경하는 함수를 제공한다. 아래와 같이 하면 bilinear방법으로 2.5배 확대된 cat.bmp와 좋은 품질의 anti-aliasing방법으로 축소된 cat.bmp를 얻을 수 있다.


import Image
cat=Image.open("cat.bmp")
bigsize=( int(cat.size[0]*2.5) , int(cat.size[1]*2.5) )
smallsize=( int(cat.size[0]*0.5) , int(cat.size[1]*0.5) )

bigcat=cat.resize(bigsize, Image.BILINEAR)
smallcat=cat.resize(smallsize, Image.ANTIALIAS)

bigcat.save("bigcat.bmp")
smallcat.save("smallcat.bmp")




[목차] 이미지프로세싱 - 시작
[이전] 기하학적 처리 - (1) 확대
[다음] 기하학적 처리 - (3) 회전