Otsu 이진화에서 threshold 값의 선택은 전경과 배경 사이의 분산을 최대로 하는 픽셀 값이다. 영상의 히스토그램이 bimodal인 경우는 잘 동작하지만, unimodal인 영상의 경우는 제대로 처리가 안된다. Valley emphasis 방법은 Otsu 방법을 사용하면서 histogram profile의 valley에 가중치를 더해주는 방식으로 threshold 값을 찾는다.
\begin{gather} \text{Ostu's method: } ~~~\text{threshold}= \underset{0\le t< 256}{\text{argmax}}~\left(\omega_1(t) m_1(t)^2 + \omega_2(t) m_2^2(t)\right)\\ \text{valley-emphasis: }~~\text{threshold}=\underset{0\le t < 256} {\text{argmax}}~ (1-p_t)\left(\omega_1(t) m_1(t)^2 + \omega_2(t) m_2^2(t)\right) \end{gather}
Bimodal 분포의 영상은 Otsu와 거의 같은 결과를 준다. 두 개 이상의 클래스로 분리도 쉽게 구현이 된다.
int valley_emphasis_Otsu(int hist[], int N) {
int istart = 0, iend = N - 1;
while (!hist[istart]) istart++;
while (!hist[iend]) iend--;
double st = 0, sxt = 0; // total pdf, total cdf;
for (int i = istart; i <= iend;i++) {
st += hist[i];
sxt += double(i) * hist[i];
}
int winner = istart;
double maxgain = 0;
double s0 = 0, sx0 = 0;
for(int i = istart; i <= iend; i++) {
s0 += hist[i]; // 1-pdf;
sx0 += double(i) * hist[i]; // 1-cdf;
double s1 = st - s0; // 2-pdf
double sx1 = sxt - sx0; // 2-cdf
double m0 = sx0 / s0; // E(X1);
double m1 = sx1 / s1; // E(X2);
double gain = (1 - hist[i] / st) * (s0 * m0 * m0 + s1 * m1 * m1);
if (gain > maxgain) {
maxgain = gain;
winner = i;
}
}
return winner;
};
728x90
'Image Recognition > Fundamental' 카테고리의 다른 글
Quadtree Segmentation (0) | 2022.05.21 |
---|---|
Harris Corner Detector (0) | 2022.04.07 |
Image rotation by FFT (0) | 2022.02.18 |
FFT를 이용한 영상의 미분 (0) | 2022.02.12 |
SVD Fitting (0) | 2022.02.07 |