2007년 10월 30일 화요일

이미지를 확대할 때는 정말 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는 정말 훌륭한 라이브러리라고 생각됩니다.

PSNR이란?

영상데이터나 음성데이터를 처리하는 과정에서 흔히 등장하는 것이 PSNR이라는 개념입니다.
PSNR을 비교한다는둥, PSNR이 얼마냐는둥의 표현이 여러군데에서 등장하는데,
PSNR이 무엇인지를 간단하게 소개하겠습니다.

PSNR은 SNR을 약간 변형해서 영상처리나 음성처리에서 사용하는 것입니다.

SNR은 Signal-to-noise의 약자로 신호와 잡음의 비율을 수치로 표현한 것입니다.
사용자 삽입 이미지

보통 SNR은 그대로 표현하기 보다는 log를 씌워서 dB 단위로 표현합니다.
사용자 삽입 이미지

이렇게 말이죠...


PSNR은 두 영상이나 음성의 차이를 숫자로 표현하는 것인데, 아래와 같은 식으로 표현됩니다.

사용자 삽입 이미지
여기서, MSE는 아래와 같습니다. 변수가 i, j 2개인 것은 영상처리를 기준으로 식을 썼기 때문에 가로, 세로를 표현하기 위해 2개입니다. 음성처리에서는 1개입니다.
(물론, 영상처리에서도 실제로는 1개를 사용합니다. 속도를 위해서요)
사용자 삽입 이미지

즉, MSE란 두 개의 같은 양의 데이터에 대해 동일한 위치에 대해 분산을 계산하는 것입니다.
(분산의 용도는 약간 다르지만, 수식적으로는 비슷합니다)

참고로, MSE는 Mean squared error의 약자인데, 우리말로 하면 "오차 제곱의 평균"이 됩니다. (역순으로 해석해야 하니까요)
그런데, 대부분의 책자에서 "평균 제곱 오차"라고 표현하고 있습니다.
해석이 되지 않는 표현을 억지로 쓰는 것은 양복에 갓을 쓰는 것과 같지 않을까요?

Signal power을 noise power로 나누는 것은 기존 SNR과 유사한데, 문제는 모든 영상을 대표하는 signal power가 없다는 것입니다.
그래서, 255의 제곱(65025)으로 signal power를 대신합니다.
물론, 255는 8비트 픽셀의 최고값이구요.
(당연히 16비트 픽셀이라면 65535의 제곱으로 계산해야 합니다)

두 영상이 완벽하게 동일하다면 분자인 MSE가 0이므로 PSNR은 무한대가 됩니다.

일반적으로 30dB가 넘으면 두 영상의 차이를 눈으로 구분하기 어렵다고 합니다.
그리고, 내용기반 탐색으로 두 영상을 비교할 때는 11dB 이상이면 꽤 유사도가 있는 영상이라고 하구요.

비디오 코덱에 대해 평가할 때도 압축률을 얼마로 했을 때 원본 동영상과의 PSNR을 비교해서 코덱의 우열을 비교합니다.

비디오 코덱에서 이 PSNR이 애매한 사안이 될 수 있습니다.
왜냐하면 PSNR이 크다고 반드시 화질이 좋은 것은 아니기 때문입니다.
화질이 좋다는 것은 주관적인 판단이 포함될 수 있기도 하고, 화질이라는 것이 인간 인지능력의 영역이기 때문이기도 합니다.

또, 없어진 부분을 복원하는 경우 얼마나 원래의 영역을 잘 재구성했는지를 PSNR로 표현하기도 합니다.

2007년 10월 4일 목요일

Lois Maxwell 타계 : 2007.9.29

영원한 Miss Moneypenny인 Los Maxwell 여사가 지난 9월 29일 타계하셨습니다.

사용자 삽입 이미지


처음 James Bond의 애인역인 Sylvia Trench 역으로 캐스팅되려 했다가, 애들 보기에 민망할 것 같다며 단역인 Moneypenny역을 선택했고,
자신의 옷을 갖고 온다는 조건으로 하루 100파운드의 일당으로 단 이틀만 촬영한 것이 첫 시작이었습니다.

이후 Sylvia Trench 역은 Goldfinger부터 등장하기 않게 되고, Maxwell의 Moneypenny는 Roger Moore의 마지막 007 영화인 A View To A Kill까지 계속되었습니다.

2001년 암수술을 마치고 나서 아들이 사는 호주에서 살고 있었으며,
자서전을 집필하다가 2007년 9월 29일 호주에 있는 Fremantle 병원에서
향년 80세의 나이로 타계하셨습니다.

M(Bernard Lee), Q(Desmond Llewelyn)에 이어 Moneypenny도 떠났군요...

삼가 고인의 명복을 빕니다.

Bond22의 엔딩 크레딧에는 "For the loving memory of Lois Maxwell" 한 줄 들어가면 좋겠습니다.