2008년 06월 18일
이미지 리사이즈에 대한 짧은(?) 고민
0. 이미지 리사이즈?
디지털 형태로 저장되어 있는 비트맵 형태의 이미지의 크기를 줄이거나 늘리는 작업을 통털어 이미지 리사이즈라고 흔히 칭한다. 조금이라도 관심이 있는 사람들이라면 이미지 리사이즈도 프로그램, 옵션 등등에 따라 각기 특징이 있고, 퀄러티 차이도 존재하며, 2~3년 전 부터는 포토샵을 이용한 다단계 리사이즈에 대한 말들도 많이 나오고 있다.
간단해만 보이는, 이미지의 크기 줄이기(혹은 늘이기)에도 복잡한 사정이 많이 있다. 줄이기와 늘이기도 또 판이하게 다르기도 하고 말이다. '까짓거 그냥 줄이며 되는거지'라고 생각할 수도 있겠다.
흔히 말하는 '언샵 마스크(일종의 샤프닝-Sharpening)필터를 단계마다 삽입하는 다단계 리사이즈'는, '이렇게 해보니 좋더라' 라는 결과적인 측면이 강조된 방법이라하겠다. 샤프닝은 원본을 망가뜨릴 가능성도 크고, 특히나 픽셀단위의 노이즈에 취약할 수 있다는 문제도 있다. (하지만, 이 방법이 좋다는 사람들에게 틀렸다고 말할 수도 없는, 애매한 문제이다)
1. 1픽셀을, 1점의 샘플로 볼 것인가? 면적으로 볼 것인가?
이미지 리사이즈를 픽셀단위의 처리까지 직접 프로그램 해본 사람이라면 한번쯤 고민하지 않을 수 없는 문제이다. 단순하지 않은 문제일 수도 있고, 어쩌면 당연히 두가지를 따로이 각기 고려해야 한다고 볼 수도 있다.
1픽셀을 면적으로 본다는 것은, 흔히 생각할 수 있는, 확대된 비트맵 이미지의 네모 모양의 면적으로 본다는 말이다. 이미지를 축소할 경우를 생각해보면, 몇개의 픽셀이 1개의 픽셀로 줄어들게 된다. 이럴 경우 1개의 새로운 픽셀의 값은 그 픽셀에 해당되는 이전의 많은 픽셀들의 값이 적절히 섞여 나오게 된다. 정수개가 아닐 수도 있고, 이전 픽셀의 조각이 중간에 잘려서 새로운 픽셀에 나뉘어 들어갈 수도 있겠다.
혹은 사각의 모양이 아닌, 바이리니어 필터로 확대한 모습이라던가 여타의 희미한 형태의 확대 이미지도 고려할 수 있겠다. 하지만 역시 기본적으로는 새로운 픽셀이 덮게 되는 이전 픽셀의 면적들의 컬러값들을 적분한 값을 새로운 픽셀의 값으로 산출해내는 방법 자체는 동일하다고 볼 수 있겠다.
또 다른 경우는, 1픽셀을 1점의 샘플로 보는 경우이다. 이것은 사운드의 샘플링 이론과 비슷하게, 1개의 샘플은 그 좌표에서 따낸 면적 0인 한 점의 색을 나타낸다고 보는 것이다. 이러할 경우 샘플링 이론에서 배우는 나이키스트 이론이라던가, 여타의 주파수에 관련된 이론 따위가 모두 적용이 가능하며, 리샘플 필터 역시 모두 비슷한 형태로 적용이 가능하게 된다. sinc 리샘플이니 하는 것들이 바로 이러한 시각으로 구현된 것들이다.
하지만 이미지에는 실제로 샘플링이나 사운드에서 사용되는 'sinc(x) = sin(x)/x ' 함수, 혹은 brickwall filter를 사용하지는 못한다. 이럴 경우 경계면에서 흔히 발생하는 ringing이 (사운드일 경우에는 귀로 느낄 수 없지만) 눈에 너무 거슬리는 물결무늬로 나타나게 된다. 따라서 해당 필터들보다는, 인터폴레이션용의 필터들, 예를 들어 Lanczos 따위가 주로 사용되게 된다.
2. 이미지 축소
축소는, 이미지의 크기를 줄이면서도 최대한 많은 정보를 손실 없이 담으면서, 표현할 수 없는 부분을 cut하여 노이즈를 효과적으로 줄일 수 있어야 한다.
사실 이러한 설명은, 위에서 말한, 1픽셀을 1샘플로 인식하는 경우에 더 가깝다고 볼 수 있다. 이럴 경우 나이키스트 이론에 충실하게, 해당 해상도가 담아낼 수 있는 이상의 정보(1픽셀 이하)를 전부 급격한 LPF(Low Pass Filter)로 처리하고, 해당 결과 중, 다시 새로운 해상도의 픽셀에 해당되는 위치의 샘플을 다시 값을 따오는 작업을 하는 것이다. 이것을 resample이라 하여, lanczos 따위의 필터들을 사용한다는 프로그램들이 사용하는 방법이 된다.
bilinear도 따지고 보면 1픽셀을 1점으로 보아서, 해당 점으로부터의 거리를 계산하여 linear하게 평균을 내는 방법을 사용하게 된다. 이러한 형태의 fir 필터를 만들고자 하면 만들 수 있겠지만, 그다지 좋은 방법은 아닐 것 같다. (...) bicubic 역시 비슷한 접근이 될 것 같고 말이다.
1픽셀을 면적으로 보고 처리하는 방법은.. 이 블로그에서 다운받을 수 있는 자작 프로그램의 Subsample Average 옵션으로 테스트가 가능하다. 일단 이론상으로는 1개의 픽셀을 1개의 미세한 사각형으로 보고, 새로 만들어질 해상도 이미지의 1픽셀도 1개의 미세한 사각형으로 보아 해당 방법으로 색을 정확히 섞어내는 방법으로 리사이즈를 한다. 사각형이 아니라 다른 형태라면 또 다른 결과가 나오겠지만.. 큰 차이는 없지 않을까? 암튼 시간 나면 그런 방법도 시도해볼 예정.
아무튼, 앞에서 설명한 프로그램을 한번 테스트 해보기 바란다. Lagrange 인터폴레이션 필터를 사용한 리샘플은, (FIR 필터의 길이가 제법 긴 만큼..) 노이즈 제거나 선예도에서도 상당한 효과를 볼 수 있을 것이다.
그리고 개인적으로는 언샤픈마스크(샤프닝)을 사용한 다단계 리사이즈를 추천하지는 않는다. 역시 원본을 심히 왜곡시킬 수 있다는 점에서 말이다.
2.1.1. 축소 테스트(패턴)

이 이미지를 4배 확대하면.. 다음과 같다.

위의 작은 원본(확대한 것 말고..) 이미지를 2/3, 즉 1/1.5로 축소하기로 하였다. 새로운 하나의 픽셀이 기존의 1.5x1.5개의 픽셀을 덮게 되는 것이다. 각 축소 리사이즈 방법은 각기 명확히 다른 결과들을 보여주고 있다.
결과 이미지는 다시 4배로 확대하여 보기 좋도록 한 것이니 오해 없으시길.
첫번째로, Bilinear Resize
고르지 못한 무늬를 보여주고 있다. 주위 4개의 픽셀로부터 거리에 따라 계산되는 점의 색은 한 픽셀을 건너뛸 때 마다 조금씩 달라지게 되므로 이러한 결과를 보여준다.
두번째로, Subsample Average

Bilinear Resize보다는 낫지만, 역시 규칙적인 무늬가 나타나고 있다. 픽셀을 면적으로 보는 방식에서 오는 어쩔 수 없는 결과이다.
세번쨰로, Lanczos Resample

앞의 두 방식에 비해 훨씬 균일한 이미지를 보여준다. 1/1.5배의 해상도에서 나타날 수 없는 체스판무늬를 필터링하여 제거한 결과가 이렇게 되는 것이다. 여전히 나타나고 있는 희미한 격자무늬는 필터 특성이라 해야겠다.
마지막으로, Lagrange Resample

거의 균일한 이미지를 보여주고 있다. lanczos보다 좀 더 ideal한 brickwall filter에 가깝다고 보아야 할까. 문제는, 글씨 등의 짙은 경계면에서 약간의 ringing이 나타난다는 것인데, 사진에서는 거의 알아보기 힘들 정도일 것이다. 어차피 최종 판단은 유저들의 몫.
2.1.2. 축소 테스트(이미지)
자. 원본이다. 클릭하면 큰 이미지 볼 수도 있고 저장도 가능하니 받아서 각자 직접 테스트도 가능하겠다.

나뭇잎, 바위, 꽃잎, 잎사귀, 풀 등을 보면 되겠다. 안타깝게도 노이즈는 안나왔다. (테스트 따로 해야되나?)
각각 510, 242로 리사이즈 하여 결과물을 뽑아보았다.
첫번째, bilinear resize


바위의 표면이 거칠게 질감이 살아나 보이지만, 샘플을 제대로 평균내지 못하여 거칠게 나타나는 것 뿐이다. 바이리니어 리사이즈는 많은 샘플을 따내지 못하니까 정밀한 리사이즈는 아니다.
두번째, subsample average


그림이 작아진만큼.. 질감이 많이 죽고 있는건 사실이지만, 나름 모든 샘플들이 다 사용되어서 비교적 정밀한 편이라고 할 수 있다.
세번째 lanczos resample


인기 있는 리사이즈 방법인 만큼 좋은 성능을 보여주고 있다.
네번째 lagrange resample


lanczos보다 약간이지만, 좀 더 또렷한 질감을 보여준다. 저장해서 확대해서 확인해보아도 좋을 듯.
3. 이미지 확대
어떠한 리사이즈도 원본보다 많은 데이터를 담아낼 수 없다. 아무리 확대하고 싶어도, 1장의 그림에서 뽑아낼 수 있는 데이터의 량은 정해져 있으므로, 확대는 그냥 확대일 뿐 더 또렷해지거나 보이지 않던 것이 보이는 일은 없다.
가끔 요새 보이는 S-Spline 리샘플이라 불리는 방법은, 윤곽선을 찾아내어 해당 부분을 별도로 처리하는 방법이 아닌가 싶다. 하지만 이러한 방식에도 문제는 항상 존재하겠지. (Threshold 값이 존재한다는 것 자체가 문제를 일으킬 수 있다는 증거 쯤 되지 않나 싶다.)
하지만 역시 위에서 설명했듯이, 확대한다고 해서 또렷해지지 않는 문제 때문에 잘 사용되는 일은 없겠다. 대부분의 사람들이 디카로 촬영한 거대한 이미지를 웹용으로 축소하는데 이미지 리사이즈 프로그램들을 많이 사용하고 있으니 말이다.
3.1.1. 확대 테스트(패턴)
축소테스트에서 사용했던 1x1 체스판 이미지를 다시 사용하였다. 다만 확대 후 옆의 불필요한 부분을 잘라내고 표시.
![]()
첫번째, Bilinear Resize의 결과

두번째, Lanczos Resample

마지막으로, Langrange Resample

확대 이미지는 따로 가타부타를 따질만한 상황은 아니겠다. 어차피 잃어버린 정보는 없을 것이라 판단되니까.
또하나의 테스트. 원본은 다음과 같다. (잘 안보이더라도 이해를....)
![]()
첫번째, Bilinear Resize

두번째, Lanczos Resample

세번째, Lagrange Resample

필터 특성에 따른 링잉이 확대시 이렇게 나타나고 있다. 흑-백이 갈리는 명확한 경계면에서의 링잉이 나타나게 되므로, 이러한 부분이 나타나는 이미지에서는 최선의 선택은 아니겠다.
3.1.2. 확대 테스트(이미지)
일단 원본.

축소 테스트에서 사용한 이미지의 일부를 1/2로 줄여서 좀 더 쨍~하게 만든 샘플. 각 10배 확대.
첫번째. bilinear resize
두번째. lanczos resample
세번째. lagrange resample.
4. 마치며..
글쎄. 짧게 쓴다고 시작했는데.. 짧지 않게 되어버렸구만. -_-;
http://openwrld.egloos.com/862897
암튼 한번 써보삼~!
# by | 2008/06/18 17:41 | 트랙백 | 덧글(2)






