[필터 앱 만들기] 1. 이미지 선형 보간 (Linear Interpolation)

이대현·2024년 3월 24일
0

iOS

목록 보기
6/9

즉, 이미지 보간은 이미지 처리에서 중요한 작업 중 하나로, 이미지의 해상도를 높이거나 크기를 변경할 때 픽셀 간의 값을 보정하고 새로운 픽셀을 생성하는 과정이다 .

1. 이미지 프로세싱에서 선형 보간이 필요한 이유

우리는 일반적으로 64 LUT(63*63*63)를 사용해 이미지 처리를 하게 되는데, 이 4배 축소된 LUT 로는 모든 색상값을 정확하게 표현하기 힘들다. 왜냐면 4로 나누는 과정에서 RGB 값이 4의 배수가 아닌 경우에는 소수점이 버려지고, 가장 가까운 4의 배수 값에 해당하는 Integer 아웃풋 픽셀만을 받게 되기 때문이다.

  • 예를 들어, RGB가 각각 (7, 7, 7)인 픽셀과 (3, 3, 3)인 두 색상값 모두 (1, 1, 1)의 같은 색상으로 표현되게 되는 문제가 생기는 것이다.

그렇다고 4로 나누는 과정 없이 256 LUT 파일을 사용하면 프로세스 처리에 드는 비용이 너무 커지게 된다.

이 문제를 해결하기 위해 나온 해결책이 이미지 보간(Interpolation) 이다. 그리고 이번 프로젝트에서 내가 사용한 방식은 가장 간단한 방식인 1차원 선형 보간(1D Linear Interpolation) 이다.

2. 선형 보간

선형 보간은 두 개의 알려진 지점 사이의 값을 직선으로 연결하여 새로운 값을 추정하는 방법이다.

결과값 =1 + (2 -1) * 비율

선형 보간 공식은 일반적으로 위과 같이 표현된다. 여기서 비율은 두 값 사이의 상대적 위치를 나타낸다. 저 단순화된 공식이 나오는 과정과 그래프는 웹에 너무 많기 때문에 생략했다. 정말 간단하기 때문에 찾아보면 보간에 대한 이해도가 훨씬 높아질 것이다. 나는 아래와 같이 구현했다.

private static func linearInterpolation(color1: CGFloat, color2: CGFloat, t: CGFloat) -> CGFloat {
    return color1 * (1 - t) + color2 * t
}
  • 즉, color1, color2 두 값이 존재해야된다. 기존 LUT RGB가 (123, 53.6, 23.8) 라면, 나는 이 값을 올림 한 값내림 한 값으로 기준 잡았다.
  • 그리고 t는 주어진 각 R 혹은 G, B를 1로 나눈 후의 나머지로 사용했다. t는 보통 0과 1 사이의 값을 가지게 된다.
    • 만약 t가 0.5라면, 이는 보간되는 값이 첫 번째와 두 번째 값 사이의 중간에 위치한다는 것을 의미하는 것이다.

3. 생각해보면 좋을 점

  • 과연 모든 픽셀마다 보간이 필요할까? 아니다. 예를 들면 floorLutIndex == ceilLutIndex 와 같은 경우는 보간이 필요하지 않을 것이다.
  • 고해상도 이미지에서는 각 RGB 처리에 정말 많은 시간이 들고, 색상값의 정확도를 늘리는 만큼 처리 속도를 줄이는 것도 중요하기 때문에, 어떤 경우에 보간이 필요한지 잘 판단해서 선택하는 것이 중요할 것이다.
profile
삽질의 기록들 👨‍💻

0개의 댓글