레이블이 PSNR인 게시물을 표시합니다. 모든 게시물 표시
레이블이 PSNR인 게시물을 표시합니다. 모든 게시물 표시

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로 표현하기도 합니다.