이미지를 확대할 때는 정말 B-Spline만이 최고일까요?

이미지 확대/축소(resampling)시 주로 사용되는 알고리즘은 nearest neighbour(이것도 알고리즘인가?), bilinear, bicubic, lanczos 그리고, b-spline입니다.

NN의 경우는 알고리즘으로 분류하기 어려운 수준이므로 빼놓고,
bilinear, bicubic, lanczos, b-spline가 진짜 resampling 알고리즘인데,
일반적으로 축소시에는 bilinear가 화질이 더 낫고,
확대시에는 bicubic, lanczos 및 b-spline가 더 낫다고 합니다.
(bicubic<lanczos<b-spline)

물론 화질은 PSNR 이야기에서도 적었듯이, "주관적"인 영역입니다.
그래서, 약간은 더 객관적인 결과를 보여주는 PSNR을 끼워넣어서 시험해봤습니다.

방식은 아래와 같은 절차로 했습니다.

1. 이미지를 지정해서 1/2로 NN으로 resizing(resampling이 아닌)
   (이미지 정보의 3/4이 손실됩니다)
2. 축소된 이미지를 각각의 resampling 알고리즘으로 2배 확대
3. 원본 이미지와 축소후 다시 확대된 이미지의 PSNR 계산

즉, 각 알고리즘이 없어진 데이터와 얼마나 유사한 결과를 계산하는가가 시험의 핵심인데, 결과는 b-spline보다는 lanczos가 PSNR이 높게 나왔습니다.

사용자 삽입 이미지
물론 b-spline가 NN보다도 낮게 나왔다는 점을 보면, 화질은 PSNR과 관계가 없다는 설명이 될 수도 있지만, 그래도 b-spline가 bicubic이나 lanczos와 비슷한 결과를 보여주기를 기대했는데, 기대가 무너져버렸네요...

결론적으로 b-spline의 결과가 화질이 더 나을 수도 있겠지만, 적어도 PSNR은 lanczos가 제일 높게 나왔다는 것입니다.

뱀다리
1. 처음 이 시험을 생각했던 이유가 널리 알려진바와 다르게 b-spline으로 resampling한 결과의 화질이 그다지 좋지 않았기 때문입니다. 너무 화질이 많이 뭉개져있어서 날카로운 느낌의 lanczos보다 많이 갑갑했기 때문입니다.
2. 모든 테스트는 CxImage 5.99c 라이브러리를 활용, Visual C++ 6.0으로 도구를 하나 만들어서 했습니다. CxImage는 정말 훌륭한 라이브러리라고 생각됩니다.