안녕하세요. 지난 포스팅의 디지털 영상 처리 - 영상 히스토그램(image historgram)에서는 영상을 히스토그램으로 변환하였을 때 밝기와 대비에 따른 히스토그램의 분포의 차이를 알아보았습니다. 그 결과로 낮은 대비를 가지는 영상을 높은 대비로 바꾸어주려면 히스토그램의 분포를 넓게 퍼뜨려주어야한다는 사실을 알았습니다(하단의 그림을 보시면 쉽게 이해할 수 있습니다.). 오늘은 높은 대비로 만드는 가장 대표적인 알고리즘인 히스토그램 평활화에 대해서 알아보겠습니다.
이제부터는 히스토그램 평활화 알고리즘를 명확하게 정의하기 위해서 몇 가지 가정을 추가하도록 하겠습니다. 먼저, $r$을 입력 영상의 밝기라고하면 $r \in [0, L-1]$를 만족합니다. 따라서 $r = 0, L-1$은 각각 검은색과 흰색을 의미합니다. 그리고 저희가 이전에 보았던 어떤 밝기 변환 함수 $T$가 $s = T(r)$을 만족한다고 가정하겠습니다. 추가적으로 밝기 변환 함수 $T$에 대해서도 몇 가지 가정이 필요합니다.
- $T(r)$은 $r \in [0, L-1]$에서 단조 증가(monotone increasing) 함수이다. 즉, 출력은 입력보다 절대 작아질 수 없음을 의미합니다.
- $r \in [0, L-1]$에 대해서 $0 \le T(r) \le L-1$를 만족한다. 즉, 입력 영상의 밝기 범위와 출력 영상의 밝기 범위는 항상 같음을 의미합니다. 예를 들어, 입력 영상의 밝기 범위가 0~255까지였는데, 출력 영상의 밝기 범위는 0~1023이 될 수 없다는 것이죠.
저희가 만약에 출력 영상으로부터 입력 영상을 얻는 역변환을 고려해보면 어떨까요? 바로 $r = T^{-1}(s)$입니다. 이 경우에는 상단의 첫번째 조건이 아래와 같이 변합니다.
- $T(r)$은 $r \in [0, L-1]$에서 엄밀 단조 증가(strictly monotone increasing) 함수이다.
이때, 단조 증가 함수는 $r_{1} > r_{2}$일 때, $T(r_{1}) \ge T(r_{2})$를 만족하는 함수 $T$로 정의되고, 엄밀 단조 증가 함수는 $r_{1} > r_{2}$일 때, $T(r_{1}) > T(r_{2})$를 만족하는 함수 $T$로 정의됩니다. 즉, 두 용어의 차이의 등호의 유무에 따라서 달라집니다. 이를 그림으로 그리면 아래와 같습니다.
기본적으로 두 변환 사이의 차이는 출력 영상으로부터 다시 입력 영상을 얻고 싶을 때 존재합니다. 예를 들어서, 단조 증가 함수의 경우에는 특정 구간에서 무한히 많은 값들이 하나의 값으로 매핑되고 있습니다. 이때, 출력 영상을 역변환시킬 때 기존 입력 영상 도메인의 어떤 값으로 매핑시킬지에 대한 모호성 문제가 발생합니다. 그에 반해, 엄밀 단조 증가 함수의 경우에는 입력 영상과 출력 영상의 각 값끼리 1 대 1 매핑이 되고 있기 때문에 모호성 문제가 발생하지 않습니다.
이제부터는 저희는 영상 히스토그램을 밝기 값 구간 $[0, L-1]$ 사이의 값을 가지는 랜덤 변수의 확률 밀도 함수(Probability Density Function;PDF)라고 생각해볼 수 있습니다. 입력 영상의 랜덤 변수를 $r$이라고 했을 때 입력 영상의 확률 밀도 함수는 $P_{r}(r)$로 표현할 수 있으며, 출력 영상의 랜덤 변수를 $s$라고 했을 때 출력 영상의 확률 밀도 함수는 $p_{s}(s)$라고 표현할 수 있을 것입니다. 기초 확률론을 바탕으로 생각해보았을 때 영상 변환 함수 $T$와 입력 영상 확률 밀도 함수 $p_{r}(r)$이 주어졌다면 출력 영상과 입력 영상 사이의 관계인 $s = T(r)$을 이용해서 출력 영상의 확률 밀도 함수를 아래의 간단한 공식을 이용해서 계산할 수 있습니다.
$$p_{s}(s) = p_{r}(r)\left|\frac{dr}{ds}\right|$$
그리고 저희는 어떤 변환 함수 $T$를 랜덤 변수 $r$에 대한 누적 분포 함수(Cumulative Density Function;CDF)라고 정의하도록 하겠습니다. 이는 히스토그램 평활화 알고리즘을 유도하기 위해서 지정한 특별한 변환 함수입니다,
$$s = T(r) = (L - 1)\int_{0}^{r} p_{r}(w) \; dw$$
그렇다면 해당 변환 함수가 저희가 이전에 설명한 가정에 맞을까요? 첫번째 가정이였던 "$T(r)$은 $r \in [0, L-1]$에서 단조 증가(monotone increasing) 함수이다."를 고려해봅시다. 일단, 다들 아시다싶이 확률 분포 함수는 항상 양수이고 적분 결과는 함수 밑의 면적을 의미합니다. 따라서, $r$이 커짐에 따라서 자연스럽게 $s$도 커진다는 것을 아실 수 있습니다. 따라서 해당 조건을 만족합니다. 두번째 가정이였던 "$r \in [0, L-1]$에 대해서 $0 \le T(r) \le L-1$를 만족한다."를 고려해보면 $r$의 최댓값이 $L-1$이기 때문에 $r = L - 1$일 때 CDF의 성질에 의해 항상 1이 되고 거기에 $L - 1$을 곱하고 있기 때문에 $s$의 최댓값 역시 $L-1$로 $r$과 그 범위가 완전히 동일하다는 점에서 해당 조건을 만족하고 있습니다. 따라서 알맞게 정의를 한 거 같군요.
이제 이 정보들을 활용해서 $\frac{dr}{ds}$을 계산해보도록 하겠습니다. 수학적으로는 미적분한 기본 원리(Fundamental Theorem of Calculus)을 이용하면 됩니다.
$$\frac{dr}{ds} = \frac{1}{\frac{ds}{dr}} = \frac{1}{\frac{dT(r)}{dr}} = \frac{1}{(L-1)\frac{d}{dr}\int_{0}^{r}p_{r}(w) \; dw} = \frac{1}{(L - 1)p_{r}(r)}$$
이 결과를 $p_{s}(s) = p_{r}(r)\left|\frac{ds}{dr}\right|$에 대입하면 아래의 식을 유도할 수 있습니다.
$$p_{s}(s) = p_{r}(r)\left|\frac{dr}{ds}\right| = p_{r}(r)\left|\frac{1}{(L-1)p_{r}(r)}\right| = \frac{1}{L - 1}$$
이를 그림으로 그리면 아래와 같습니다.
정리하자면 영상 대비를 증가시킨다는 것은 영상 히스토그램이 고르게 분포되어있는 것과 동일하다고 볼 수 있다고 하였습니다. 따라서 변환 함수가 영상 히스토그램이 고르게 분포시키도록 만들기 위해서 입력 영상의 확률 분포 함수의 누적 분포 함수로 정의를 했더니 출력 영상의 확률 분포가 균등확률분포로 변환되었음을 알 수 있습니다. 즉, 저희가 지금까지 한 것은 영상 히스토그램 평활화의 이론적 배경에 대해서 알아보았으며 실제로 가능하다는 것을 보여주기까지 하였습니다.
하지만, 실제로 저희가 적용하는 분야는 연속적인 함수가 아닌 디지털 영상 함수이기 때문에 이산 데이터에 적용할 수 있는 알고리즘을 구현해야합니다. 아주 운이 좋게도 지금까지 설명한 것을 이산 데이터에 그대로 적용을 해볼 수 있습니다. 다만, 적분은 합으로 바뀌는 것만 다르죠. 먼저, $n_{k}$를 디지털 영상 내에서 $r_{k}$을 밝기값으로 가지는 픽셀의 개수라고 정의하고 $M, N$을 각각 영상의 가로, 세로라고 하면 $k = 0, 1, \dots, L - 1$에 대해서 영상 히스토그램을 아래와 같이 정의할 수 있습니다.
$$p_{r}(r_{k}) = \frac{n_{k}}{MN}$$
그리고 저희가 변환 함수로 입력 영상의 누적 분포 함수를 사용하겠다고 하였습니다. 이를 이산화시키면 단순히 적분을 합으로만 바꾸어주면 됩니다.
$$s_{k} = T(r_{k}) = (L - 1)\sum_{j = 0}^{k}p_{r}(r_{j}) = \frac{(L - 1)}{MN} \sum_{j = 0}^{k}n_{j}$$
따라서 저희는 이제부터 변환 함수 $T(r_{k})$를 히스토그램 평활화(Histogram Equalization)이라고 정의하도록 하겠습니다. 해당 알고리즘은 단순하지만 영상 대비를 높힐 때 아주 강력한 역할을 할 수 있습니다. 이 알고리즘을 간단한 예제를 통해서 알아보도록 하겠습니다. 먼저 아래의 표와 같이 입력 영상의 히스토그램을 계산하였다고 가정하겠습니다. 여기서 $M = N = 64$라고 가정하도록 하겠습니다. 따라서 $MN = 4096$입니다.
그러면 8개의 밝기값은 아래와같이 변환해주면 됩니다.
$$s_{0} = T(r_{0}) = 7\sum_{j = 0}^{0} p_{r}(r_{j}) = 7p_{r}(r_{0}) = 1.33$$
$$s_{1} = T(r_{1}) = 7\sum_{j = 0}^{1} p_{r}(r_{j}) = 7(p_{r}(r_{0}) + p_{r}(r_{1})) = 3.08$$
$$s_{2} = T(r_{2}) = 7\sum_{j = 0}^{2} p_{r}(r_{j}) = 7(p_{r}(r_{0}) + p_{r}(r_{1}) + p_{r}(r_{2})) = 4.55$$
$$s_{3} = T(r_{3}) = 7\sum_{j = 0}^{3} p_{r}(r_{j}) = 7(p_{r}(r_{0}) + p_{r}(r_{1}) + p_{r}(r_{2}) + p_{r}(r_{3})) = 5.67$$
$$s_{4} = T(r_{4}) = 7\sum_{j = 0}^{4} p_{r}(r_{j}) = 7(p_{r}(r_{0}) + p_{r}(r_{1}) + p_{r}(r_{2}) + p_{r}(r_{3}) + p_{r}(r_{4})) = 6.23$$
$$s_{5} = T(r_{5}) = 7\sum_{j = 0}^{5} p_{r}(r_{j}) = 7(p_{r}(r_{0}) + p_{r}(r_{1}) + p_{r}(r_{2}) + p_{r}(r_{3}) + p_{r}(r_{4}) + p_{r}(r_{5})) = 6.65$$
$$s_{6} = T(r_{6}) = 7\sum_{j = 0}^{6} p_{r}(r_{j}) = 7(p_{r}(r_{0}) + p_{r}(r_{1}) + p_{r}(r_{2}) + p_{r}(r_{3}) + p_{r}(r_{4}) + p_{r}(r_{5}) + p_{r}(r_{6})) = 6.86$$
$$s_{7} = T(r_{7}) = 7\sum_{j = 0}^{7} p_{r}(r_{j}) = 7(p_{r}(r_{0}) + p_{r}(r_{1}) + p_{r}(r_{2}) + p_{r}(r_{3}) + p_{r}(r_{4}) + p_{r}(r_{5}) + p_{r}(r_{6}) + p_{r}(r_{7})) = 7.00$$
여기에 추가적으로 저희는 디지털 영상을 다루고 있기 때문에 각 출력값을 반올림을 통해서 정수값으로의 변환이 필요합니다. 이를 정리하면 아래와 같습니다.
$$s_{0} = 1.33 \rightarrow 1$$
$$s_{1} = 3.08 \rightarrow 3$$
$$s_{2} = 4.55 \rightarrow 5$$
$$s_{3} = 5.67 \rightarrow 6$$
$$s_{4} = 6.23 \rightarrow 6$$
$$s_{5} = 6.65 \rightarrow 7$$
$$s_{6} = 6.86 \rightarrow 7$$
$$s_{7} = 7.00 \rightarrow 7$$
이를 매핑 테이블로 바꾸어서 편하게 볼 수 있도록 만들어보겠습니다.
$k$ | $r_{k} = k$ | $s_{k} = T(r_{k})$ |
$k = 0$ | $r_{0} = 0$ | $s_{0} = T(r_{0}) = 1$ |
$k = 1$ | $r_{1} = 1$ | $s_{1} = T(r_{1}) = 3$ |
$k = 2$ | $r_{2} = 2$ | $s_{2} = T(r_{2}) = 5$ |
$k = 3$ | $r_{3} = 3$ | $s_{3} = T(r_{3}) = 6$ |
$k = 4$ | $r_{4} = 4$ | $s_{4} = T(r_{4}) = 6$ |
$k = 5$ | $r_{5} = 5$ | $s_{5} = T(r_{5}) = 7$ |
$k = 6$ | $r_{6} = 6$ | $s_{6} = T(r_{6}) = 7$ |
$k = 7$ | $r_{7} = 7$ | $s_{7} = T(r_{7}) = 7$ |
마지막으로 Table 3.1을 $s_{k}$의 관점에서 써보도록 하겠습니다.
$k$ | $s_{k} = k$ | $n_{s_{k}}$ | $p_{s}(s_{k})=\frac{n_{s_{k}}}{MN}$ |
$k = 0$ | $s_{0} = 0$ | $n_{s_{0}} = 0$ | $p_{s}(s_{0})=\frac{n_{s_{0}}}{4096} = 0$ |
$k = 1$ | $s_{1} = 1$ | $n_{s_{1}} = n_{0} = 790$ | $p_{s}(s_{1})=\frac{n_{s_{1}}}{4096} = 0.19$ |
$k = 2$ | $s_{2} = 2$ | $n_{s_{2}} = 0$ | $p_{s}(s_{2})=\frac{n_{s_{2}}}{4096} = 0$ |
$k = 3$ | $s_{3} = 3$ | $n_{s_{3}} = n_{1} = 1023$ | $p_{s}(s_{3})=\frac{n_{s_{3}}}{4096} = 0.25$ |
$k = 4$ | $s_{4} = 4$ | $n_{s_{4}} = 0$ | $p_{s}(s_{4})=\frac{n_{s_{4}}}{4096} = 0$ |
$k = 5$ | $s_{5} = 5$ | $n_{s_{5}} = n_{2} = 850$ | $p_{s}(s_{5})=\frac{n_{s_{5}}}{4096} = 0.21$ |
$k = 6$ | $s_{6} = 6$ | $n_{s_{6}} = n_{3} + n_{4} = 985$ | $p_{s}(s_{6})=\frac{n_{s_{6}}}{4096} = 0.24$ |
$k = 7$ | $s_{7} = 7$ | $n_{s_{7}} = n_{5} + n_{6} + n_{7} = 448$ | $p_{s}(s_{7})=\frac{n_{s_{7}}}{4096} = 0.11$ |
이를 그림으로 그리면 아래와 같습니다.
실제로 히스토그램 평활화를 적용한 결과 입력 영상은 왼쪽으로 대부분의 픽셀값들이 몰려있었으나 변환 후 출력 영상을 보면 그래도 많이 평평해진 것을 볼 수 있습니다. 아무래도 이산 데이터를 다루고 있기 때문에 연속 데이터와 같이 완전히 이상적인 균등확률분포는 나오지는 않습니다만 이 정도면 만족할만한 결과입니다.
변경사항
22/5/15 : $p_{s}(s) = p_{r}(r)\left|\frac{ds}{dr}\right| \rightarrow p_{s}(s) = p_{r}(r)\left|\frac{dr}{ds}\right|$ (영상초보님 댓글 감사합니다.)
'image processing' 카테고리의 다른 글
디지털 영상처리 - 지역적 히스토그램 처리 (0) | 2021.03.11 |
---|---|
디지털 영상 처리 - 히스토그램 지정(Histogram Matching) (0) | 2021.03.10 |
디지털 영상 처리 - 영상 히스토그램(Image Histogram) (3) | 2021.02.02 |
디지털 영상 처리 - 밝기 변환 함수 (0) | 2021.01.20 |
디지털 영상 처리 - 디지털 영상 기초 2 (0) | 2021.01.14 |