이진 영상을 만들때 주로 사용하게 되는 임계값 분석은 배경과 객체를 분리시켜 0과 1로 쉽게 구분할 수 있게 한다.
8비트 그레이스케일 이미지는 0~255 사이의 픽셀값을 가지므로 그 안의 임계값을 설정하면 임계값 이상의 값은 모두 1로, 아래는 모두 0으로 이진화 한다. (경우에 따라 반대로 작동할 수도 있다.)
이렇게 데이터가 이진화되면 다양한 필터링을 활용하는데 도움이 된다.
최적화된 임계점을 찾기 위해서는 여러 알고리즘이 필요하지만 가장 대표적인 방법은 다음과 같다.
void CImageDlg::OnClickedButtonThreshold()
{
CString strValue;
GetDlgItemText(IDC_EDIT_VALUE, strValue);
int nThreshold = _ttoi(strValue); //MFC에서는 _atoi()나 _wtoi()로 자동 변환해줌
if (nThreshold < 0 || nThreshold > 255)
{
AfxMessageBox(_T("0~255 사이의 값을 입력해주세요."));
return;
}
if (m_result != NULL)
{
delete[] m_result;
m_result = new BYTE[IMAGE_SIZE];
memset(m_result, 0, IMAGE_SIZE);
}
for (int i = 0; i < IMAGE_SIZE; ++i)
{
m_result[i] = m_original[i] > nThreshold ? 255 : 0;
//원본 픽셀값이 임계값보다 크면 결과값에 255를, 아니면 0
}
UpdateViewer2();
}
UpdateViewer2
는 기존의 OutputImage() 함수랑 동일한 기능을 수행한다.