<--애드센스--> <--네이버웹마스터-->

[컴퓨터 비젼] - MFC/ openCV /히스토그램을 이용한 영상 이진화 처리 

 

히스토그램 출력

1. 전체 화면을 255(흰색)로 초기화

2. X축은 밝기 값으로 Y축은 히스토그램의 값으로 출력

3. 히스토그램의 크기만큼 0(검정색)으로 출력

 

for (i = 0 ; i < width ; i++ ){

int idx = i * w_ratio;

int value = Hist[idx] * h_ratio;

for (j = 0 ; j < value ; j++ )

m_OutImage[(height-j-1)*width + i] = 0;

 

자신이 지정한 임계 값보다 크면 255, 작으면 0으로 이진화

 

for(int i =0 ; i < height ; i++)

{

for(int j=0 ; j < width ; j++)

{

if(m_InImage[(i*width) + j] >= m_Threshold)

m_OutImage[(i*width) + j] = 255;

else

m_OutImage[(i*width) + j] = 0;

}

}

 

● Gonzalez 알고리즘

밝기 값의 최소와 최대 값의 평균을 초기 임계 값으로 지정

 

while(Diff >= 1 )

{

// 그룹 1에 속한 화소 집합의 평균계산

int nSum = 0, nCnt = 0; // nSum: 그룹 1에 속하는 전체 화소 밝기값

// nCnt: 그룹 1의 전체 화소수

for (int i = 0 ; i < T ; i++ ){

nSum += hist[i] * i;

nCnt += hist[i];

}

 

double Mu_1 = (double)(nSum/nCnt); // 그룹 1의 밝기값 평균

 

// 그룹 2에 속한 화소 집합의 평균계산

nSum = 0, nCnt = 0; // nSum: 그룹 2에 속하는 전체 화소 밝기값,

// nCnt: 그룹 2의 전체 화소수

for (int i = T ; i < 256 ; i++ )

{

nSum += hist[i] * i;

nCnt += hist[ i ];

}

 

double Mu_2 = (double)(nSum/nCnt); // 그룹 2의 밝기값 평균

 

// 두 화소 그룹의 밝기값 평균을 이용한 임계값 결정

int T_Last = (int)((Mu_1 + Mu_2)/2);

 

Diff = abs(T-T_Last ); // 새롭게 계산된 임계값과 이전의 임계값과의 차이계산

T = T_Last;

}

 

m_Threshold = T; // 최종 Gonzalez 임계 값 결정

 

● Otsu 알고리즘

그룹을 두 개로 나누어 각각의 그룹의 밝기 값을 구한다. 밝기 값을 누적시킨 다음 전체 화소수로 나누어 전체 밝기 값에 대한 평균을 계산한다.

for(int k = temp_threshold-3 ; k <= temp_threshold+3 ; k++){

W1 = H_cdf[k]/N; // 그룹 1의 확률

W2 = 1. - W1; // 그룹 2의 확률

 

Mu_1 = H_m[k]/H_cdf[k]; // 그룹 1의 밝기값 평균

Mu_2 = (H_m[L-1] - H_m[k])/(N-H_cdf[k]); // 그룹 2의 밝기값 평균

 

Sigma_B = W1*(Mu_1 - Mu_T)*(Mu_1 - Mu_T) +

W2*(Mu_2 - Mu_T)*(Mu_2 - Mu_T);

 

if(Sigma_B > Sigma_Bmax){

Sigma_Bmax = Sigma_B;

m_Threshold = k;

 

● open cv에서 threshold()함수를 사용하여 이진화

Mat src = imread("lena.bmp", IMREAD_GRAYSCALE);

Mat dst = src.clone(); // 영상처리 후 결과영상

 

threshold(src, dst, thresh, maxValue, THRESH_BINARY);

+ Recent posts