[C++/MFC] Threshold

Lachi_·2023년 12월 6일
0

mfc

목록 보기
11/16

이진 영상을 만들때 주로 사용하게 되는 임계값 분석은 배경과 객체를 분리시켜 0과 1로 쉽게 구분할 수 있게 한다.
8비트 그레이스케일 이미지는 0~255 사이의 픽셀값을 가지므로 그 안의 임계값을 설정하면 임계값 이상의 값은 모두 1로, 아래는 모두 0으로 이진화 한다. (경우에 따라 반대로 작동할 수도 있다.)
이렇게 데이터가 이진화되면 다양한 필터링을 활용하는데 도움이 된다.

최적화된 임계점을 찾기 위해서는 여러 알고리즘이 필요하지만 가장 대표적인 방법은 다음과 같다.

  • 임계값 T를 기준으로 영역을 2개 그룹으로 나누었을 때 각 집합내 의 명암 분포는 균일하고 집합 사이의 명암 차이는 최대화될 수 있 도록 한다.
  • 모든 가능한 T에 대해 점수를 계산하여 가장 좋은 T를 최종 임계값 으로 선택한다.
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() 함수랑 동일한 기능을 수행한다.

profile
개인 저장용. 오류 매우 많음.

0개의 댓글