어푸푸

이미지 스케일링에 대하여 본문

잡동사니/IT

이미지 스케일링에 대하여

예수님부처 2019. 9. 21. 04:02

근래에 그래픽카드를 샀다. 그리고 이전 포스트에서 썼듯이 그래픽카드를 사고나니 모니터 뽐뿌가 온다. 현재는 23인치 FHD 모니터를 쓰고 있는데, 32인치 QHD 모니터가 좋지 않을까 하는 생각이 점점 더 드는 것이다. 다만 고민되는 점이 하나 있었는데 FHD 해상도와 QHD 해상도는 정수배가 아니라는 것이다.

FHD 해상도와 QHD 해상도는 정수배가 아니기때문에 QHD 해상도에서 FHD 컨텐츠를 전체화면으로 둘 경우에는 이미지의 열화가 발생한다. 조금 더 자세하게 이야기해보자. FHD는 가로 픽셀이 1920개이다. QHD는 가로 픽셀이 2560개이다. 결국 1920개의 점을 2560개의 점에서 표현해야 한다. 그런데 이게 딱딱 맞아떨어지지가 않아서 중간 값을 추정해서 쓰다보니 이미지의 열화가 발생할 수 밖에 없는 것이다. 이 문제가 중요할 수 밖에 없는 이유가 두 가지 있는데, 첫 번째는 현재 많은 비디오들이 FHD급 해상도라는 것이다. QHD 모니터에서 이 비디오들을 전체화면으로 보면 화질 열화가 일어난다. 두 번째로는 게임의 해상도가 올라가면 FPS가 떨어지니 옵션을 타협하지 않으려면 낮은 해상도에서 렌더링을 해야 할 수도 있다는 것이다. 다시 말해서 FPS를 위해 FHD로 게임을 렌더링하고 QHD 모니터에서 이를 출력하면 FHD 모니터에서 출력하는 것보다 열화가 이루어지니 QHD 모니터를 사야하는가에 대한 근본적인 의문점이 들기 시작했다.

하지만 여기에서 질문을 하지 않을 수 없다. 과연 이미지 열화가 그렇게 크게 발생하는가? 많은 사람들이 영상을 감당하는데에는 크게 체감이 되지 않고 게임을 할 때에는 크게 체감이 된다고 말한다. 이 체감은 일관성이 없는 것으로 보인다. 많은 게임들은 실사같은 그래픽을 추구한다. 그런데 진짜 실사인 비디오에서는 이미지 열화가 체감이 되지 않고, 게임에서는 체감이 된다고? 썩 명쾌하지는 않은 기준이다. 혹자는 이렇게 말한다. 비디오는 모니터를 바꾼다고 해상도가 늘어나지 않으니 QHD 맛을 볼 수가 없었지만, 게임은 QHD로 하다보니 거기에 익숙해져서 FHD로 렌더링하면 체감이 크게 되는 것이 아니냐고 말이다. 나는 이게 상당히 일리있는 말이라고 생각한다. 물론 아닐수도 있지만.

이러한 배경으로 나는 이미지 열화에 대해서 조금 더 자세히 살펴보는 것이 좋겠다는 생각을 했다. 그리고 좀 찾아보니 이걸 자세히 살펴보려면 이미지 스케일링 기법을 살펴봐야 한다는 것을 알게되었다. 이미지 스케일링은 bilinear 방법, bicubic 방법, lanczos resampling 방법 등으로 수행할 수 있다. 계산 시간은 bilinear가 제일 짧지만, 결과물이 다소 뭉개져서 나온다는 단점이 있다. Lanzcos resampling 방법의 경우 계산하는데에 걸리는 시간은 길지만 산출되는 이미지의 품질은 좋다는 장점이 있다고 알려져있다.

그래서 그냥 bilinear 방법과 lanzcos resampling 방법을 직접 비교해보기로 했다. 이를 위하여 매트랩으로 해당 방법들을 코딩했다. 물론 성능 최적화는 개나 줬다. 어차피 상용으로 쓸 것도 아니고 한 번 돌리고 말 것이므로.. 아래와 같이 검은색 픽셀과 하얀색 픽셀이 교차하는 그림을 원본으로 삼았다.

 

위에서 말한 모니터에서 발생하는 이미지의 열화는 업스케일링시에 발생한다. 따라서 5배 (좀 크긴 하다) 업스케일링을 했을 때의 결과를 비교해봤다. 아래 그림은 bilinear 방법을 썼을 때의 결과물을 크롭한 것과 Lanczos resampling을 썼을 때의 결과를 크롭한 것이다. 여기에서 Lanzcos resampling 방법의 결과물이 더 좋은 것을 확연하게 알 수 있다. 격자 무늬가 사각형인 것이 더 잘 표현되었기 때문이다. Lanzcos resampling을 사용할때는 필터의 크기 a를 정해줘야 한다. 테스트를 해보았을 때에는 필터의 크기가 1인 것과 2인 것은 다소 차이가 났지만, 2 이상인 경우들은 결과물이 거의 동일했다. 따라서 업스케일링을 할 때에는 가능하다면 Lanzcos resampling 방법을 사용하는 것이 좋겠다는 것이 결론이 되겠다. 이 때 필터 크기는 2일 때 가장 효율적이다.

Bilinear Filter
Lanzcos resampling

 

마지막으로 다소 케케묵은 문제일수도 있지만 '과연 이미지의 픽셀은 한 지점의 색깔로 봐야하는가 아니면 특정한 유한한 면적을 지닌 사각형으로 볼 것인가?'라는 주제에 대해 짧게 써보려고 한다. 필자는 이미지 프로세싱이나 전산쪽 전공은 아니고, CFD가 전공이다. CFD를 전공한 입장에서 나는 이 문제가 그렇게 낯설어보이지 않는다. 내 대답은 '해당 면적에서의 평균 값이다.' 이다. 이는 카메라의 이미지 센서를 생각해봐도 그렇다. 절대로 빛은 한 점으로 (point) 들어오지 않는다. 다양한 지점에서 반사된 빛이 특정 픽셀을 나타내는 이미지 센서 여기저기로 들어올 것이고, 결국 이 값들은 하나의 평균 값이 된다. 그런 평균 값이 한 픽셀의 값을 나타낸다. 따라서 사진을 찍는 과정을 생각해봐도 해당 면적을 가지는 곳의 평균 값이 픽셀의 값임을 알 수 있다. 만약에 진짜 한 점이면 어떡하냐고? Broadening effect 때문에 어차피 그렇게 안될 것이다.

이 포스트의 결론: Lanzcos resampling의 품질 > Bilinear의 품질 (정수배 업스케일링이니 논란의 여지는 있다.)