어떤 이미지들은 너무 밝거나 어두워서 또는 주변 픽셀과의 대비가 낮아서 무슨 이미지인지 알아보기 힘든 경우가 있다. 이러한 이미지들은 특정한 처리를 통해 좀 더 선명하게 만들어줘야 한다. 오늘은 여러가지 처리기법 중 가장 기본적인 Point processing과 Histogram equalization에 대해 알아보려고 한다.
Point processing
Point processing이란 이미지의 각 픽셀을 독립적으로 처리하는 방식을 말한다. 주변 픽셀은 고려하지 않고 오로지 입력 픽셀 값만에 의존하여 출력 픽셀들을 계산한다. 아래 그림을 확인해보자.
원본 이미지의 녹색 픽셀로부터 특정한 operation을 통해 출력 픽셀들의 값을 모두 결정했으므로 해당 과정은 Point processing에 해당한다.
만약, 입력 이미지의 어떤 한 픽셀이 아닌 주변 픽셀 값들을 고려하여 출력 픽셀 값들을 결정한다면, 그건 필터링에 해당한다. 아래 그림 같은 경우는 필터링에 해당한다.
Point processing의 예제를 몇가지 확인해보자. 원본 이미지의 모든 픽셀 값들의 집합을 f(x)라고 하자.
입력 픽셀 값 f(x)에 대해 특정한 operation을 적용한다. f(x)에 대해 상수를 단순히 더하거나 빼서 밝기를 조절할 수 있고, f(x)에 대해 곱하거나 나누어서 대비를 조절할 수도 있다.
이를 수식으로 나타내면 다음과 같다.
g(x, y) : 출력 이미지의 (x, y)위치의 픽셀 값
f(x, y) : 입력 이미지의 (x, y)위치의 픽셀 값
h : Intensity trnasformation function(변환 함수)
를 의미한다.
어떤 이미지에 대해 위와 같은 수식을 적용하게 되면, 해당 이미지의 모든 위치의 픽셀에 대해 연산을 진행한다. 따라서 연산 수행 횟수를 줄이기 위해 같은 픽셀 값을 지니는 픽셀에 대해서는 연산을 하지 않는 것이 좋다. 따라서 수식으로 나타낼 때도 s = h(r) 로 나타내며 의미는 다음과 같다.
r : 입력 이미지의 픽셀 값들의 집합
s : 출력 이미지의 픽셀 값들의 집합
그래프로도 확인해보자.
x축이 입력 이미지의 픽셀 값을 의미하며, y축이 Intensity transformation function을 적용한 출력 이미지의 픽셀 값을 의미한다.
(a)의 경우, 어두운 픽셀 값들은 더 어둡게, 밝은 픽셀 값들은 더 밝게 만들어주고 있다.
(b)의 경우, Threshold 값 k를 지정하여, k보다 작은 픽셀 값에 대해서는 출력 픽셀을 0으로 만들고, k보다 큰 픽셀 값에 대해서는 1로 만들고 있다.
Point processing에서 자주 사용되는 Intensity transformation function인 "Power-law(gamma) transformation"에 대해서도 알아보자. 수식으로 나타내면 다음과 같다.
r : 입력 이미지의 픽셀 값들의 집합
s : 출력 이미지의 픽셀 값들의 집합
c : 상수 (보통 1로 설정)
𝛾(gamma) : 밝기 조절을 결정하는 지수
위 수식에서 우리는 𝛾(gamma) 값을 조절하면서 이미지를 가공한다. 그래프를 통해 𝛾(gamma)의 변화에 따른 픽셀 값들의 변화를 확인해보자.
𝛾(gamma) < 1 : 어두운 픽셀 값들은 밝아지고, 밝은 픽셀 값들은 더 밝아지고 있다.
→ 어두운 부분이 강조되고 전체적인 밝기가 밝아졌다.
𝛾(gamma) = 1 : 변화 x
𝛾(gamma) > 1 : 어두운 픽셀 값들은 더 어두워지고, 밝은 픽셀 값들은 어두워졌다.
→ 밝은 부분이 강조되고 전체적인 밝기가 어두워졌다.
왼쪽 상단에 있는 이미지가 원본 이미지이다.
오른쪽 상단의 이미지 𝛾(gamma) = 0.6
왼쪽 하단의 이미지 𝛾(gamma) = 0.4
오른쪽 하단의 이미지 𝛾(gamma) = 0.3
𝛾(gamma)의 값이 작아질수록 이미지가 확실히 밝아지는 것을 확인할 수 있다.
왼쪽 상단에 있는 이미지가 원본 이미지이다.
오른쪽 상단의 이미지 𝛾(gamma) = 3.0
왼쪽 하단의 이미지 𝛾(gamma) = 4.0
오른쪽 하단의 이미지 𝛾(gamma) = 5.0
𝛾(gamma)의 값이 커질수록 이미지가 확실히 어두워지는 것을 확인할 수 있다.
Histogram equalization
Histogram은 특정 이미지에 대해 0~255 사이의 픽셀 값들의 분포를 나타낸다. 아래 예시를 확인해보자.
위 그림처럼 특정 구역에 픽셀이 집중적으로 모여있을 때는, Histogram stretching을 사용하여 픽셀 값의 영역을 재배치하여 대비(contrast)를 높일 수 있다.
0 ~ 255 사이의 픽셀 값을 0~15의 level로 구분하여 나타내고, 각 level별로 픽셀 값이 몇개씩 분포해있는지 나타낸 예제가 있다. 아래 그림을 보자.
이미지의 픽셀값이 대체적으로 5 ~ 9 사이에 몰려있는 것을 확인할 수 있다.
이에 대해서 stretching function을 적용해보자. 수식으로 나타내면 다음과 같다.
a i+1 : 이미지 내 픽셀 값이 몰려있는 영역의 최대 grey 레벨
a i : 이미지 내 픽셀 값이 몰려있는 영역의 최소 grey 레벨
b i + 1 : 퍼뜨리고자 하는 영역의 최대 grey 레벨
b i : 퍼뜨리고자 하는 영역의 최소 grey 레벨
그래프로 확인해보자.
확실히 5~9 사이에 분포하던 픽셀 값이 넓게 펼쳐진 것을 확인할 수 있다. 그러나 넓게 펼쳐지기만 하고 픽셀 값이 균등하게 분포되어 있지 않다. 이를 위한 기법이 Histogram equalization이다.
Histogram equalization의 가장 이상적인 케이스는 다음과 같이 모든 픽셀 값들을 grey level에 대해 균등하게 분포시키는 것이다.
위 그래프를 확률 밀도 함수(PDF, Probability Density Function)으로도 나타낼 수 있다. 원래 픽셀 값은 0~255의 정수로 나타내기 때문에 PDF로 나타낼 수 없지만, 그럼에도 불구하고 이론적인 모델링을 위해 "연속적인 경우"를 가정하고 PDF로 표현한다.
위 그래프를 PDF로 나타낸 그림은 다음과 같다.
여기서 입력 이미지와 출력 이미지의 픽셀 수 자체는 같기 때문에 다음 수식이 성립한다.
입력 이미지에 대한 PDF : $f_R(r)$
출력 이미지에 대한 PDF : $f_S(s)$
$f_R(r)$을 $f_S(s)$로 변환하려면, 다음과 같은 함수를 적용해야 한다.
여기서 각각의 픽셀 값들을 T(r)의 값으로 변환해준다.
여기서 T(r)은 monotonic increasing function이다.
Monotonic increasing function은 값은 같아도 되지만 감소하지 않는 함수를 말한다.
위 수식들을 토대로 $f_R(r)$ 은 다음과 같이 전개될 수 있다.
여기서 알 수 있는 건 T(r)의 도함수가 $f_R(r)$과 같아진다는 것이다.
이는 곧 T(r)이 monotonic increasing function이라는 것을 증명한다.
위 수식에서 $f_R(r) = T'(r)$ 이 성립하므로, 아래 수식도 성립한다.
해당 수식은 $T(r)$ 을 누적 분포 함수(CDF)로 정의한 수식이다.
그러나 위 수식은 continuous case를 가정한 이론적인 모델이다. 실제 이미지는 discrete하므로, 다음과 같은 근사가 필요하다.
해당 수식을 적용한 예제를 표로 나타내서 확인해보자.